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

Я использую стандартные программы обнаружения утечки памяти Визуального CRT от ; когда я звоню _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 самое низкое количество в отчете об утечке

13
задан Roman Starkov 9 February 2010 в 00:35
поделиться

2 ответа

Без использования наследования (как упомянуто автором ), кажется, вы ищете решение, которое может преобразовать один класс в другой с предварительным утверждением разработчика знает и понимает сходство 2 классов .

Нет существующего решения для преобразования между объектами. Можно попробовать:

-121--991110-

Можно сделать что-то подобное.

let inline sum<'a when 'a : (static member (+) : 'a -> 'a -> 'a)> a b =
    a + b

let result = sum<int> 3 4

Однако если я попытаюсь let result = sum 3 4 я получаю ошибку «неоднозначность типа, присущую использованию оператора '(+)'»

-121--2220092-

Большая пощечина лба... Одна из «очевидных» причин заключается в том, что распределение # 133 произошло до установки точки останова...

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

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

9
ответ дан 2 December 2019 в 01:21
поделиться

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

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

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

1
ответ дан 2 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: