LINUX.ORG.RU

memory leaks in C C++


0

0

В GNU libc есть такие приятные штуковины как mtrace(), и прилагаемая
к ней утилита на перле mtrace, с их помощью очень удобно отлавливать
memory leaks, можно найти источник вплоть до номера строки в исходниках.
В принципе они работают и с C++, но нельзя локализовать
источник, так как в Си используются new/delete, в которых
вызов malloc/free скрыт в библиотеках.
Может кто подскажет как решить сию проблемму.


Фришных я не видел, а вот коммерческих достаточно много. Получить к ним ссылки можно в конце страницы http://www.gnu.org/software/ddd. Но разработчик одного из самых крутых мудов sojourn очень рекомендовал insure++, это, если мне не изменяет память парасофтовская разработка.

timur
()

можешь переопредилить operator new [] и delete хранить номера блоков самому, что касается номеров строки то нужно сделать эти свои операторы inline и использовать __LINE__ когда запоминаешь блок. Для не освобожденных блоков выводишь номера строк и размер не освобожденной памяти.

Ogr
()

Это понятно, что определить то можно, но во-первых насколько я помню new и delete - inline быть не могут, а во вторых если и моглибы быть они inline, то __LINE__ - формируется препроцессором, а инлайн подстановка выполняется компилятором, посему от его значений легче не станет, тут надо каким то образом раскрутить стек, и определить адрес откуда new, была вызвана, а по адресу вызова уже и строку определить не проблема. Кстати как из переопределенных new, delete вызвать оригинальные?

temofey
() автор топика

В одной книжке (не помню) была написана небольшая библиотечка с переопределением new и delete, но для доса. Если надо то могу залить.

anonymous
()

C++Programming-HOWTO посмотри

babai
()

а если new/delete переопределить макросами как malloc/free (compiler не выматерится?) то mtrace будет видеть malloc/free а программер new/delete. что получится напиши, оченно хочется узнать результат :)

anonymous
()

да, облажался немного :), не потянет старичок cpp такого, Страуструпу надо яйца отстрелить за любовь к нововведениям, значит придётся тебе простенький препроцессор подменяющий new/delete на malloc/free самому написать, как отладишь, сюда положи, plz, чтобы другие попользовать могли

anonymous
()

Называется - Остапа несло. Спасибо конечно за совет,
но это немного через Ж.... Если не скажать больше.

Переопределить new и delete - как уже было сказано тебе никто не запрещает.
А как стек раскручивается так я в реализации mtrace, посмотрел.
Оказывается есть в gcc такая хитрая встроенная функция - __builtin_return_address(n),
возвращает адрес возврата текущей функции,если n=0, если n=1,
то адрес возврата родительской функции. Таким образом можно и раскрутить стек
вызовов. Правда на некоторых архитектурах сия функция работает только
при n=0. Но это не беда.
Короче смысл такой переопределяем new/delete в них
используя __builtin_return_address(n) -вычисляем адрес откуда были они вызваны
и радуемся жизни.
Как оказалась есть куча готовых реализаций - к примеру LeakTracer,
я его правда немного подравнял, но в общем это почти то что надо.
Может как то на веб и выложу.

temofey
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.