Вопрос

Я использую процедуры обнаружения утечек памяти 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 с использованием CRT «многопоточной отладочной библиотеки DLL».
  2. Мой код представляет собой DLL, загружаемую сторонним продуктом.
  3. «Нормальные» точки останова работают нормально;переход через работает нормально; __asm int 3 тоже работает нормально.
  4. Никакой другой ценности для _crtBreakAlloc также вызывает точку останова (во всяком случае, не те, которые я пробовал)
  5. 133 — наименьшее число в отчете об утечке.

Это было полезно?

Решение

Сильный удар по лбу...Одна из «очевидных» причин — произошло выделение № 133. до точка останова установлена...

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

Что касается «Потенциально релевантной информации № 4» в моем первоначальном вопросе — ну, я попробовал несколько значений, но почему-то ни одно из них не превышало 133…

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top