Как избежать "(нулевого)" StackTrace в DPH_BLOCK_INFORMATION? - PullRequest
1 голос
/ 18 сентября 2009

У меня взрыв, отслеживающий некоторую кучу повреждений. Я включил стандартную проверку кучи страниц с помощью

gflags /p /enable myprogram.exe

и это подтверждает коррупцию:

===========================================================
VERIFIER STOP 00000008: pid 0x1040: corrupted suffix pattern 

    10C61000 : Heap handle
    19BE0CF8 : Heap block
    00000010 : Block size
    00000000 : 
===========================================================

Когда я включаю полную проверку кучи страниц (gflags /p /enable myprogram.exe /full) в ожидании того, что это приведет к возникновению ошибки во время появления повреждения, я больше ничего не получаю.

Я начал надеяться, читая Расширенная отладка Windows: повреждение памяти, часть II - куча , которая является главой из Расширенная отладка Windows . Я установил WinDbg и загрузил символы отладки для user32.dll, kernel32.dll, ntdll.dll в соответствии с http://support.microsoft.com/kb/311503. Теперь, когда программа останавливается в отладчике, я могу выполнить эту команду, чтобы просмотреть информацию о странице кучи:

0:000> dt _DPH_BLOCK_INFORMATION 19BE0CF8-0x20
ntdll!_DPH_BLOCK_INFORMATION
   +0x000 StartStamp       : 0xabcdaaaa
   +0x004 Heap             : 0x90c61000 
   +0x008 RequestedSize    : 0x10
   +0x00c ActualSize       : 0x38
   +0x010 FreeQueue        : _LIST_ENTRY [ 0x0 - 0x0 ]
   +0x010 TraceIndex       : 0
   +0x018 StackTrace       : (null) 
   +0x01c EndStamp         : 0xdcbaaaaa

Я встревожен трассировкой стека (null). Теперь http://msdn.microsoft.com/en-us/library/ms220938%28VS.80%29.aspx говорит:

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

Но мне интересно, есть ли у кого-нибудь мысли по поводу увеличения шансов увидеть трассировку стека с момента выделения.

Спасибо за чтение!

Ответы [ 2 ]

1 голос
/ 29 апреля 2011

Согласно Microsoft, функция malloc в модуле времени выполнения C (CRT) использует пропуск указателя кадра (FPO) в некоторых версиях Windows. Вы можете не увидеть полную информацию о стеке функции malloc. (http://support.microsoft.com/kb/268343)

Если возможно, попробуйте связать отладочную версию CRT, например, Чтобы решить эту проблему, воспользуйтесь ссылкой / MDd.

1 голос
/ 18 сентября 2009

Ах, ха! Оказывается, мне нужно было включить больше gflags параметров:

gflags /i myprogram.exe +ust

Который имеет этот эффект:

ust - Create user mode stack trace database

Кажется простым, когда я вижу описание параметра. Дурак я. Но мне также, кажется, нужно установить размер базы данных трассировки, прежде чем она вступит в силу:

gflags /i myprogram.exe /tracedb 512

... или что-то еще (в МБ).

...