Почему _CrtSetBreakAlloc может не вызвать точку останова?
-
19-09-2019 - |
Вопрос
Я использую процедуры обнаружения утечек памяти 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 с использованием CRT «многопоточной отладочной библиотеки DLL».
- Мой код представляет собой DLL, загружаемую сторонним продуктом.
- «Нормальные» точки останова работают нормально;переход через работает нормально;
__asm int 3
тоже работает нормально. - Никакой другой ценности для
_crtBreakAlloc
также вызывает точку останова (во всяком случае, не те, которые я пробовал) 133 — наименьшее число в отчете об утечке.
Решение
Сильный удар по лбу...Одна из «очевидных» причин — произошло выделение № 133. до точка останова установлена...
Просто первая утечка произошла до того, как была вызвана моя DLL.На самом деле это не обязательно утечка, потому что я звоню _CrtDumpMemoryLeaks
когда DLL выгружается, а не когда родительское приложение завершает деинициализацию.
Что касается «Потенциально релевантной информации № 4» в моем первоначальном вопросе — ну, я попробовал несколько значений, но почему-то ни одно из них не превышало 133…
Другие советы
Похоже, вы компилируете свое приложение с помощью неотладочной библиотеки, например.если вы используете релизную версию библиотеки, которая должна сломать ваше приложение, она этого не сделает.Возможно, это происходит из-за того, что вы используете стороннее приложение.Также возможно, что неотладочная dll загружается вместо отладочной во время выполнения.
Попробуйте проверить, загружены ли нужные библиотеки DLL для вашего приложения во время отладки, а также убедиться, что приложение или DLL действительно отлажены.(Иногда вам явно необходимо загрузить dll или exe в отладчик.)
Это все, о чем я могу думать, не видя более подробной информации об этом...