Отслеживание утечки памяти в плагине с использованием _crtBreakAlloc, _CRTDBG_MAP_ALLOC - PullRequest
2 голосов
/ 22 сентября 2011

У нас есть несколько плагинов для постэффектов, которые, как мы видим, имеют утечку памяти.Чтобы исследовать это, я поиграюсь с Обнаружение утечек памяти и изоляция в компиляторе vcc / среде выполнения.Я включил обнаружение утечек с помощью:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

И получаю хороший дамп утечек.Тем не менее, я не получаю имена файлов и номера строк.Мое лучшее предположение заключается в том, что это потому, что я создаю dll, которая используется exe-эффектом, и #define должен быть выполнен в исполняемом файле, а не в моем плагине (это не совсем соответствует моей ментальной моделииз того, что это определение и включает в себя на самом деле, но это лучшее, что я могу придумать).

Так что другой вариант - установка точек останова для конкретных номеров выделения памяти.Тем не менее, утечки распределения не являются набором последовательных номеров распределения, поэтому я ограничил успех с этим.

Итак, есть какие-нибудь идеи здесь?Или как лучше использовать этот инструмент, или другие способы исследовать это?Спасибо!

1 Ответ

1 голос
/ 22 сентября 2011

Вам необходимо перекомпилировать эти DLL с одинаковыми #define с - они превращают вызовы malloc() в вызовы malloc_dbg(), и это позволяет использовать имена файлов и номера строк в дампе.Это все, что делает «обнаружение утечек» - каждому выделению передаются имя файла и номер строки, они сохраняются и затем выгружаются.Нет вызовов malloc_dbg() - нет имен файлов и номеров строк.

Также дампы утечки (все связанные функции) выполняются за время выполнения - дамп выполняется для кучи текущего времени выполнения модуля, не обязательно для всехмодули.Поскольку в вашем процессе может быть несколько сред выполнения C ++ (каждая DLL может быть связана с собственной средой выполнения), может случиться так, что дамп просто не будет выполнен для ожидаемой среды выполнения.

...