powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Профилирующая обертка для new
23 сообщений из 23, страница 1 из 1
Профилирующая обертка для new
    #39701334
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решаю задачу профилирования выделения и освобождения памяти для крупного программного проекта с большим количеством файлов исходного кода. По работе с памятью проект написан в смешанном стиле, используется средства как C, так и C++. Для функций malloc, calloc, realloc и free сделал обертки примерно в таком стиле. Возьмем для примера malloc.
Вхождения вида ptr=malloc(size)
заменил на вызов собственной функции
ptr=wrapper_malloc("path_to_this_source_file", __FUNCTION__, __LINE__, size)
а в этом раппере выделяю память стандартным malloc и печатаю в специальный файл всю сопроводительную информацию,
переданную в аргументах, а также значение выделенного адреса в 16-ричном виде. Результат malloc в конце возвращаю.
Остальные рапперы построены по тому же принципу с учетом конкретики других функций.
Это работает.
Но как быть с профилированием new? С-функции однотипны, а new всякий раз работает с конструкторами разных классов, у каждого из этих конструкторов свои аргументы. Не хочется каждый new оборачивать по отдельности, это очень долго и трудоемко. Можно ли предложить для new тоже какое-то более и ли менее общее решение, позволяющее профилировать такую информацию (плюс печать еще и имени типа/класса)? Я знаю, что оператор new можно перезагружать (написать свою реализацию), но сам я ни разу еще этого не делал, да и поможет ли здесь такое решение? Тот же вопрос и для delete. Заранее спасибо гуру C++ за консультацию.
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701340
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если смысл всей этой кухни только ради того, чтобы отслеживать утечки памяти, то для Windows есть стандартное решение

работает для new/delete и malloc/free, поддерживается отслеживание утечек в разных потоках общего процесса
если кратко, то берутся две точки программы, например, в начале функции main и перед выходом из нее в return. Анализируется heap и если остались неосвобожденными какие-либо объекты IDE выводит их перечень с указаниями размеров разлитой памяти и, если возможно, местом дислокации выделения этой памяти в коде.

к сожалению, оно не поможет отслеживать вам утечки COM объектов
RAII наше все!
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701344
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum,
спасибо за ответ. Нет, задача состоит не в поиске утечек. Все утечки давно выявлены и устранены. Речь идет именно о профилировании: построить статистику выделения памяти по конкретным местам, размерам, времени жизни выделенной памяти. На основании собранной информации и анализа данных предложить где и какие кастомные аллокаторы можно использовать для
экономии памяти. По кастомным аллокаторам есть множество теоретических работ - где, когда, какие и в каких случаях, не буду сейчас вдаваться, т.к. вопрос не в этом. Тут важно профилировать именно ту информацию, о которой я написал.
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701347
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvLaUy, оператор new в классах всегда один и тот же:
Код: plaintext
1.
2.
void* ClassName::operator new (size_t) throw(bad_alloc);
void* ClassName::operator new[] (size_t) throw(bad_alloc);
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701357
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
да, конечно, это так. Я прошу практического совета или подсказки, в какую сторону смотреть.
Вот у меня две строчки кода:
A a = new A(C, D);

B b = new B(E, F);

Можно ли построить какую-то более или менее общую обертку, которая во-первых:
1) выполняла бы в каждом случае заказанную работу, т.е. выделяла бы память под инстанс данного класса, передавая в конструктор
нужные аргументы
2) записывала в лог-файл сопроводительную информацию, включая имя класса, для которого создан инстанс

Я могу написать для первого случая
A a = wrapper_newA_twoargs("filename", "A", __FUNCTION__, __LINE__, C,D)
B b = wrapper_newB_twoargs("filename", "B", __FUNCTION__, __LINE__, E,F)

но это же не дело - для каждого конструктора каждого класса писать свой wrapper, тогда проще уж прямо в коде рядом
с вызовом new делать запись в лог. Существует ли более или менее общее решение (с помощью перезагрузки new или с помощью
шаблонов), которое позволило бы и для A, и для B делать какой-то однотипный вызов?
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701360
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто переопредели
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
void* operator new(size_t sz) throw(bad_alloc)
{
  register void* ptr = std::malloc(sz);
  if (NULL == ptr)
  {
    my::writeLog(sz);
    throw bad_alloc();
  }
  my::writeLog(sz);
  return ptr;
}
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701365
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
да, это понятно. Но так я смогу логировать только размер выделенной памяти и само значение выделенного адреса, но не информацию о том, из какого места исходного кода была запрошена память, и имя класса/структуры (если память выделена
не для данных простого типа).
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701369
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, видимо мои вопросы от недостаточной грамотности. Я путаю вызов new и вызов конструктора класса, а это разные вещи, которые у меня в голове смешались. Не буду морочить специалистам голову, можно закрыть топик.
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701384
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvLaUyЛадно, видимо мои вопросы от недостаточной грамотности. Я путаю вызов new и вызов конструктора класса, а это разные вещи, которые у меня в голове смешались. Не буду морочить специалистам голову, можно закрыть топик.
да нет, почему же тема довольно нормальная, просто как такового простого решения у нее нет.

то что вы хотите похоже на описание шаблона функтора с произвольным количеством передаваемых аргументов, на этот счет можно поковырять std::function или в сторону Александреску с его списками типов
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701387
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы просто не воспользоваться профилером? Он покажет всё, в том числе и вызовы
функций выделения памяти.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701388
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, насчет закрыть я несколько погорячился. Пусть пока остается, я отпишусь, когда определюсь с решением.
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701390
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
да, покажет, но мне по каждому вызову нужна кастомная информация, которую профайлер обеспечить не может.
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701392
clihlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvLaUy,

Если хочется как смаллоком то
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
void* operator new(size_t sz,  char const * file, int line) throw(bad_alloc)
{
  register void* ptr = std::malloc(sz);
  if (NULL == ptr)
  {
    /// print file, line, size
    throw bad_alloc();
  }
  /// print file, line, size
  return ptr;
}

#define new new(__FILE__, __LINE__)



можно впринцыпе и коллстек напечатать
http://man7.org/linux/man-pages/man3/backtrace.3.html
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701393
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvLaUyмне по каждому вызову нужна кастомная информация

"По каждому"? Например?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701410
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
clihlt,

да, да, спасибо, мне что-то подобное тоже уже пришло в голову, но коллега cerebrum предложил посмотреть в сторону std::function и "высшего пилотажа" Александреску, отработаю еще и этот путь.
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701419
clihlt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701421
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701443
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum,

"Ваше соединение не защищено

Владелец rsdn.org неправильно настроил свой веб-сайт. Чтобы защитить вашу информацию от кражи, Firefox не соединился с этим веб-сайтом."
Но про variadic templates не только на rsdn можно почитать.
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701447
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvLaUy,

сижу на последнем firefox'e - никаких проблем с rsdn.ru нет
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701456
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrum,
верю. У меня из дома тоже нет. Но на работе, видимо, более сильные настройки безопасности.
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701487
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
EvLaUyCerebrum,
верю. У меня из дома тоже нет. Но на работе, видимо, более сильные настройки безопасности.Видимо, у тебя на работе стоит антивирус с контролем всех HTTPS соединений, а у FireFox свой собственный контейнер сертификатов доверенных CA. Тебе надо вручную экспортировать сертификат локального доверенного CA антивируса из системного контейнера сертификатов и импортировать его в контейнер FireFox'а.
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701513
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Профилирующая обертка для new
    #39701662
EvLaUy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miksoft,
так работает, спасибо.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Профилирующая обертка для new
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]