2010-02-09 1 views
10

Я использую программы обнаружения ошибок памяти Visual CRT от <crtdbg.h>; когда я называю _CrtDumpMemoryLeaks один распределение сообщается последовательно при каждом вызове программы:Почему _CrtSetBreakAlloc не вызывает точку останова?

{133} normal block at 0x04F85628, 56 bytes long. 
Data: <    > B0 81 F8 04 B0 81 F8 04 B0 81 F8 04 CD CD CD CD 

Адрес, но изменяется {133} всегда одинакова.

В соответствии с инструкциями MSDN по How to set breakpoints on memory allocation number, я должен быть в состоянии установить точку останова на 133 распределения с этим вызовом:

_CrtSetBreakAlloc(133); 

и я также могу проверить в окне просмотра, что {,,msvcr90d.dll}_crtBreakAlloc действительно установлен в 133 . После выхода программы в отчете об утечке по-прежнему отображается # 133 (наряду с некоторыми более высокими номерами), но точка останова не возникает. Почему это может быть и как мне получить точку останова?

Потенциально соответствующая информация:

  1. VS2008, используя «многопоточная отладку DLL» CRT
  2. Моего кода DLL, которая загружается с помощью стороннего продукта
  3. «Нормальные» контрольные точки работа прекрасна; пошагово работает хорошо; __asm int 3 отлично работает.
  4. Ни одно другое значение _crtBreakAlloc не вызывает прерывания либо (не те, которые я пытался так или иначе)
  5. 133 является наименьшим номером в отчете о течи

ответ

8

Major лоб пощечины ... Один «очевидно, «причина в том, что если было выделено распределение № 133 до, то точка останова была установлена ​​...

Это просто, что первая утечка возникает, когда вызывается моя DLL. На самом деле это не обязательно утечка, потому что я вызываю _CrtDumpMemoryLeaks, когда DLL выгружается - не тогда, когда родительское приложение завершается деинициализацией.

Что касается в моей оригинальный вопрос «потенциально соответствующей информации № 4» - ну я попробовать несколько значений, но почему-то никто не был выше, чем 133 ...

+1

Я предполагаю, что это выгодно поставить точку останова в самом начале вашей программы, а затем установить {,, msvcr90d.dll} _crtBreakAlloc до 133 вместо вызова _CrtSetBreakAlloc (133); хотя я не уверен, что это замечание применимо в вашей ситуации. :) В любом случае, рад, что он разрешился. – Gyuri

+0

FYI, один простой (и общий) способ, это может произойти, если ваше распределение является статическим. Например. вы сделали «std :: vector» в области файлов. – imallett

0

Это звучит, как вы можете компилировать приложение с не-debug lib, например. если вы используете версию выпуска lib, которая должна разорвать ваше приложение, это не будет сделано. Возможно, это происходит потому, что вы используете стороннее приложение. Также возможно, что не-debug dll загружается вместо отладочной версии во время выполнения.

Убедитесь, что загруженные файлы DLL загружаются для вашего приложения во время отладки, а также что приложение или DLL фактически отлаживаются. (Иногда вы явно должны загрузить DLL или EXE в отладчик.)

Это все, что я могу думать, не видя больше деталей об этом ...

+0

Я думаю, тот факт, что _CrtDumpMemoryLeaks работает предполагает, что я m, связанное с отладочной ЭЛТ правильно (не совсем уверенно). Я дважды проверил, что правильная отладочная сборка моей DLL загружается сторонним приложением. Само приложение является «выпуском» приложения. Отладчик определенно подключен. –