Как избежать «(нулевого)» StackTrace в DPH_BLOCK_INFORMATION?
Вопрос
У меня взрыв, отслеживающий некоторую кучу коррупции. Я включил стандартную проверку кучи страниц с помощью
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/ ru-ru / library / ms220938% 28VS.80% 29.aspx говорит:
Поле StackTrace не всегда будет содержать ненулевое значение по различным причинам. Во-первых, обнаружение трассировки стека поддерживается только на платформах x86, а во-вторых, даже на машинах x86 алгоритмы обнаружения трассировки стека не являются полностью надежными. Если блок является выделенным блоком, трассировка стека предназначена для момента выделения. Если блок был освобожден, трассировка стека находится в свободный момент.
Но мне интересно, есть ли у кого-нибудь мысли по увеличению шансов увидеть трассировку стека с момента выделения.
Спасибо за чтение!
Решение
Ах, ха! Оказывается, мне нужно было включить дополнительные параметры gflags
:
gflags /i myprogram.exe +ust
Который имеет этот эффект:
ust - Create user mode stack trace database
Кажется простым, когда я вижу описание параметра. Дурак я. Но мне также кажется, что нужно установить размер базы данных трассировки, прежде чем она вступит в силу:
gflags /i myprogram.exe /tracedb 512
... или что-то еще (в МБ).
Другие советы
Согласно Microsoft, функция malloc в модуле времени выполнения C (CRT) использует пропуск указателя кадра (FPO) в некоторых версиях Windows. Вы можете не увидеть полную информацию о стеке функции malloc. (Http://support.microsoft.com/kb/268343) р>
Если возможно, попытайтесь связать отладочную версию CRT, например, Чтобы решить эту проблему, воспользуйтесь ссылкой / MDd.