Почему _CrtSetBreakAlloc не может вызывать точку останова? - PullRequest
13 голосов
/ 09 февраля 2010

Я использую подпрограммы обнаружения утечки памяти в 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 (вместе с некоторыми более высокими числами), но точка останова не возникает. Почему это может быть и как мне получить точку останова?

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

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

Ответы [ 2 ]

9 голосов
/ 09 февраля 2010

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

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

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

1 голос
/ 09 февраля 2010

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

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

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

...