如何避免“(空)”在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调试:内存损坏第二部分 - 堆,这是从高级Windows调试一章。我安装的WinDbg,并根据 http://support.microsoft下载调试符号user32.dll
,kernel32.dll
,ntdll.dll
。 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 /库/ ms220938%28VS.80%29.aspx 说:
栈跟踪字段将不总是含有各种原因的非空值。首先堆栈跟踪检测的仅是在x86平台上支持的第二,甚至在x86机器上的堆栈跟踪检测算法并不完全可靠。如果该块是分配的块的堆栈跟踪是分配的时刻。如果该块被释放,该栈跟踪是用于自由的时刻。
但我不知道是否有人对提高从分配时刻看到堆栈跟踪的机会,任何的想法。
感谢阅读!
解决方案
啊哈!原来我需要使更多gflags
选项:
gflags /i myprogram.exe +ust
具有这种效果:
ust - Create user mode stack trace database
看起来非常简单,当我看到参数描述。愚蠢的我。但我也似乎需要设置跟踪数据库的大小才生效:
gflags /i myprogram.exe /tracedb 512
...或任何(在MB)。
其他提示
据微软,在C运行时malloc函数(CRT)模块使用在某些Windows版本帧指针省略(FPO)。你可能不会看到malloc函数的完整堆栈信息。 (http://support.microsoft.com/kb/268343)
如果可能,尝试调试版本CRT相连,例如与/ MDD选项链路,来解决这个问题。