我有一个爆炸追踪一些堆损坏。我已经启用标准页堆验证与

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.dllkernel32.dllntdll.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选项链路,来解决这个问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top