Как избежать "(нулевого)" StackTrace в DPH_BLOCK_INFORMATION?
У меня взрыв, выслеживающий некоторую кучу коррупции. Я включил стандартную проверку кучи страниц с помощью
gflags /p /enable myprogram.exe
и это успешно подтверждает коррупцию:
================================================== ========= VERIFIER STOP 00000008: pid 0x1040: поврежденный шаблон суффикса 10C61000: ручка кучи 19BE0CF8: блок кучи 00000010: размер блока 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 Куча: 0x90c61000 +0x008 RequestedSize: 0x10 +0x00c ActualSize: 0x38 +0x010 FreeQueue: _LIST_ENTRY [ 0x0 - 0x0 ] +0x010 TraceIndex: 0 +0x018 StackTrace: (ноль) +0x01c EndStamp: 0xdcbaaaaa
Я встревожен (null)
трассировки стека. Теперь http://msdn.microsoft.com/en-us/library/ms220938%28VS.80%29.aspx говорит:
Поле StackTrace не всегда будет содержать ненулевое значение по разным причинам. Во-первых, обнаружение трассировки стека поддерживается только на платформах x86, а во-вторых, даже на машинах x86 алгоритмы обнаружения трассировки стека не являются полностью надежными. Если блок является выделенным блоком, трассировка стека предназначена для момента выделения. Если блок был освобожден, трассировка стека идет в свободный момент.
Но мне интересно, есть ли у кого-нибудь мысли по поводу увеличения шансов увидеть трассировку стека с момента выделения.
Спасибо за прочтение!
2 ответа
Ах, ха! Оказывается, мне нужно было включить больше gflags
опции:
gflags / i myprogram.exe + ust
Который имеет этот эффект:
ust - Создать базу данных трассировки стека в пользовательском режиме
Кажется простым, когда я вижу описание параметра. Дурак я. Но мне также, кажется, нужно установить размер базы данных трассировки, прежде чем она вступит в силу:
gflags / i myprogram.exe / tracedb 512
... или что угодно (в МБ).
Согласно Microsoft, функция malloc в модуле времени выполнения C (CRT) использует пропуск указателя кадра (FPO) в некоторых версиях Windows. Вы можете не увидеть полную информацию о стеке функции malloc. (Http://support.microsoft.com/kb/268343)
Если возможно, попытайтесь связать отладочную версию CRT, например, ссылку с параметром /MDd, чтобы решить эту проблему.