Как получить доступ к полной трассировке стека malloc в приложении MFC 8.0? - PullRequest
0 голосов
/ 15 июля 2009

Я пытаюсь найти утечку памяти в приложении Windows MFC 8.0 (Release build).

После неудачного отображения полной трассировки стека выделений с использованием WinDbg (или umdh) из-за проблемы malloc CRT с FPO я попытался применить предложенное решение здесь (то есть, используя LeakDiag с включенным DbgHlp StackWalk) только для того, чтобы понять, что LeakDiag НЕ генерирует файл журнала при мониторинге C Runtime Allocator , однако при мониторинге Windows Heap Allocator он работает но, опять же, трассировка стека заканчивается при вызове malloc.

Символы настроены правильно, так как я вижу имена функций, имена файлов, строки и т. Д. В сгенерированном файле.

Кто-нибудь знает, почему я не могу войти в систему C Runtime Allocator ? и почему я не могу получить полную трассировку стека, даже если я использую DbgHlp StackWalk API?

Буду признателен за любую подсказку, которую вы можете дать.

Дополнительная информация:

Как выглядят трассировки моего стека:

Я получил это с помощью WinDbg. Адрес указан как! Heap -l как протекший блок.

0:000> !heap -p -a 25b18400  
address 25b18400 found in
_HEAP @ 2a70000
  HEAP_ENTRY Size Prev Flags    UserPtr UserSize - state
    25b183f8 0008 0000  [07]   25b18400    00021 - (busy)
    Trace: 00a4
    7c97d6dc ntdll!RtlDebugAllocateHeap+0x000000e1
    7c959d18 ntdll!RtlAllocateHeapSlowly+0x00000044
    7c92b298 ntdll!RtlAllocateHeap+0x00000e64
    78134d83 MSVCR80!malloc+0x0000007a

Ответы [ 2 ]

1 голос
/ 06 августа 2009

Почему вы не используете сторонние инструменты?

т.е. скачать оценочную копию Intel параллельного инспектора. Его довольно просто установить и запустить против существующей сборки выпуска. И это показывает - в большинстве случаев - полный стек (я почти уверен, что он также находит некоторые ложные срабатывания).

Выберите версию выпуска в менеджере конфигурации и убедитесь, что он создает pdb-файл (в настройках компоновщика). Затем просто начните «Проверять ошибки памяти».

Существует ряд других сопоставимых инструментов: AQTime, GlowCode. Все это не требует перекомпиляции или инструментовки.

1 голос
/ 05 августа 2009

Кто-нибудь знает, почему я не могу войти в систему C Runtime Allocator?

Вы используете сборку Debug? Debug CRT имеет свою собственную проверку кучи, которая побеждает UMDH и другие инструменты, которые работают в глобальной куче ОС. Убедитесь, что при использовании UMDH и друзей все функции отладки кучи MFC и MSVCRT выключены .

Возможно, также вы или кто-то в вашем процессе изменили порог распределителя для малых блоков со значения по умолчанию 0.

В противном случае CRT версии 8.0 должен просто пересылать запросы в глобальную кучу, что вам и нужно для инструментов отладки кучи.

и почему я не могу получить полную трассировку стека, даже если я использую DbgHlp StackWalk API?

Я думаю, что Скайвинг довольно подробно описал детали в ссылках, которые вы дали. Просто для повторения, часть, которую он, возможно, недооценил, - это «на x86», «идеальные» трассировки стека, как правило, невозможны, так как нет метаданных, связанных с конкретной функцией (за исключением символов отладки), которая описывает, как раскрутить мимо этого ". Для DbgHlp весьма непрактично разматывать функцию (например, malloc MSVCRT), используя EBP в качестве регистра с нуля.

Конечно, вы можете пересобрать свою собственную библиотеку CRT из исправленных источников или попробовать заменить CRT malloc / free.

Действительно, я думаю, что вашим лучшим шагом будет воспроизведение утечки на платформе x64, где разматывание стека гарантированно будет достаточно надежным.

...