C++: Как считать все инстанцированные объекты во времени выполнения?

У меня есть большая платформа, состоящая из многих классов C++. Существует ли способ использовать какие-либо инструменты во времени выполнения, проследить все объекты C++, которые создаются и в настоящее время существуют?

Например, в определенное время t1, возможно, приложение имеет объекты A1, A2 и B3, но во время t2, это имеет A1, A4, C2 и так далее?

Это - кросс-платформенная платформа, но я знаком с работой в Linux, Солярисе и (возможно) Mac OS X.

8
задан nina 28 April 2010 в 12:37
поделиться

5 ответов

Вы можете вставить код в деструктор и конструктор объектов, которые вы хотите подсчитать:

SomeObject::SomeObject() {
   ++globalSomeObjectCounter;
}

SomeObject::~SomeObject() {
   --globalSomeObjectCounter;
}

Не забудьте увеличить счетчик в всех конструкторах (конструкторах копирования и т. Д.)

РЕДАКТИРОВАТЬ: В этой ситуации можно использовать любопытный повторяющийся шаблон шаблона:

template <typename T>
struct Counter
{
    Counter() {++counter;}
    virtual ~Counter() {--counter;}
    static int counter;
};
template <typename T> int Counter<T>::counter(0);

, а затем :

class SomeObject : public Counter<SomeObject> {
}

для автоматического создания счетчика для каждого типа класса.

10
ответ дан 5 December 2019 в 15:21
поделиться

Я предполагаю, что вы учитываете только объекты в куче. В этом случае вы можете регистрировать все вызовы как новые и удалять, заменяя их некоторыми настраиваемыми макросами.

Мы разработали такое настраиваемое средство ведения журнала. Основная цель заключалась в отслеживании утечек памяти, но его также можно использовать для определения количества объектов в любой конкретный момент времени. Например,

#define MY_NEW_OBJECT(a, T) \
    a = new T;              \
    MY_LOGGING((LM_DEBUG, "[NEW OBJ ] 0x%08X(%s), %4d bytes. %-20s - %-40s - %4d\n", a, #T,  \
    sizeof(T), __FILE__, __func__, __LINE__));

MyClass* myObj;
MY_NEW_OBJECT(myObj, MyClass);

MY_LOGGING автоматически добавляет метку времени в начало каждой строки. Строка содержит имя класса, имя файла, номер строки, имя функции и размер.

Утилита анализирует файл журнала и в любой момент генерирует графики, показывающие количество объектов, общий использованный размер и т. Д.

Конечно, вы должны заменять каждый новый / удаляющий вызов макросами. Что могло бы быть совсем немного работы.

1
ответ дан 5 December 2019 в 15:21
поделиться

Сделайте специальный базовый класс, эквивалентный объекту Java, и сделайте каждый класс производным от него. Затем в этот класс поместите глобальные операции противодействия, которые Андреас Бринк предлагает в конструкторе/деструкторе соответственно. В дополнение к тому, чтобы производный объект считался только одним объектом, это означает, что вам нужно только инструментировать 1 конструктор и 1 деструктор. Хотя, конечно, недостатком является то, что вам нужно немного изменить определение каждого класса...

0
ответ дан 5 December 2019 в 15:21
поделиться

Это только Solaris, но если это вариант, вы можете использовать dtrace, чтобы отслеживать количество вызовов конструкторов и деструкторов для каждого из ваших классов и распечатывать их через определенные промежутки времени. Это потребует больших усилий для настройки всех блоков ввода / вывода, но я подозреваю, что сценарий dtrace может быть автоматически сгенерирован.

0
ответ дан 5 December 2019 в 15:21
поделиться

Я сам не использовал его, Massif может быть тем инструментом, который вы ищете. http://valgrind.org /info/tools.html

0
ответ дан 5 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: