GFlags是windows debug tools 工具包下的一个工具,在Windows 2000的Resource Kit中也可以找得到。用来设置一些调试属性,总体上分为3个级别System, Kernel, 和 Image File。
我们设置好Path环境变量,将其指向Debug tools工具的目录下。
输入如下命令行:
gflags -p /enable test.exe /full /unaligned
完全页堆块结构
链接:http://msdn.microsoft.com/zh-cn/library/ms220938%28v=vs.80%29.aspx
在启用完整页堆块时,将使用保护页并且将立即捕获缓冲区溢出/不足,因为在溢出/不足时程序将出现访问冲突。这些故障很容易调试,因为当前堆栈跟踪直接指向中断的代码。如果采用普通页堆,或者出于对齐的原因在缓冲区末尾的小填充图案中出现损坏,则只有在释放了该块的情况下才可以检测出损坏。在这些情况下,需要更为复杂的检测技术。为简化在此类情况下进行检查的过程,页堆管理器在所有分配(完全或常规)前都放置了一个头。该头包含几个重要的信息位(用于在某些情况下分配的拥有的堆、用户请求的大小和堆栈跟踪)。下面将介绍完全和常规页堆块的结构。
常规页堆块结构

完全页堆块结构

信息块具有以下结构:
DPH_BLOCK_INFORMATION
ULONG StartStamp;
PVOID Heap;
SIZE_T RequestedSize;
SIZE_T ActualSize;
LIST_ENTRY FreeQueue;
PVOID StackTrace;
ULONG EndStamp;
Heap 字段存储拥有的堆。块的用户请求的大小以 RequestedSize 为单位。堆栈跟踪地址存储于 StackTrace 字段中。
StackTrace 字段将不是始终包含用于各种原因的非空值。首先,只有在 x86 平台上才支持堆栈跟踪检测;其次,即使在 x86 计算机上,堆栈跟踪检测算法也并不完全可靠。如果该块是一个已分配的块,则堆栈跟踪将针对分配那一刻。如果该块已被释放,则堆栈跟踪将针对释放那一刻。
然后,没有然后了,打开以后在发生越界时应该能抓第一现场了。