Почему _CrtSetBreakAlloc не вызывает точку останова?

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

{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 на Как установить точки останова на номер выделения памяти, я должен был бы установить точку останова на 133-ом распределении с помощью этого звоните:

_CrtSetBreakAlloc(133);

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

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

  • VS2008, используя "многопоточную библиотеку отладки DLL" CRT
  • Мой код - это DLL, загружаемая сторонним продуктом.
  • "Нормальные" точки останова работают нормально; пошагово работает хорошо; __asm int 3 отлично работает.
  • Никакое другое значение для _crtBreakAlloc также не вызывает точку останова (не те, которые я пробовал)
  • 133 - самое низкое число в отчете об утечке

Ответ 1

Поражение основного лба... Одна "очевидная" причина заключается в том, что если распределение # 133 произошло до того, как была установлена ​​точка останова...

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

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

Ответ 2

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

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

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