使用Gflags来检测heap问题

先说一下问题,如何让下面程序(release版本)能立即报出异常,程序出错?默认情况很大可能是不crash的

int  _tmain( int  argc, _TCHAR *  argv[])
{
    
char   * p = new   char [ 10 ];
    
for ( int  i = 0 ;i < 10 ; ++ i)    p[i] = i;
    p[
10 ] = 10 ;
    
return   0 ;
}


众所周知,heap问题一般比较难于处理,因为程序报错的地方也许不是问题的源头,最好的办法是在第一时间让对堆的非法操作报错,这样就能找到根本原因。

Gflags是随着微软Debugging tools for windows一起发布的工具。
使用Gflags就能让系统对heap的分配,访问做一些检查,尽早的发现问题。
Gflags的具体用法请参考微软的帮助文档,就不罗嗦了

Run: gflags -p /enable test.exe /full /unaligned

这时候运行起来后就会crash,程序会break在p[10]=10;这一句上

那么gflags是如何做到这一点的呢
我们在windbg中去观察一下,不难发现原因

0:000> g
(da8.f88): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
eax=01766ff6 ebx=00000000 ecx=0000000a edx=016c5000 esi=00000001 edi=00403378
eip=0040101f esp=0012ff80 ebp=0012ffc0 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
bbb!wmain+0x1f:
0040101f c6400a0a        mov     byte ptr [eax+0Ah],0Ah     ds:0023:01767000=??

0:000> !address eax
    016c0000 : 01766000 - 00001000
                    Type     00020000 MEM_PRIVATE
                    Protect  00000004 PAGE_READWRITE
                    State    00001000 MEM_COMMIT
                    Usage    RegionUsagePageHeap
                    Handle   016c1000

0:000> !address eax+0a
    016c0000 : 01767000 - 00059000
                    Type     00020000 MEM_PRIVATE
                    Protect  00000001 PAGE_NOACCESS
                    State    00001000 MEM_COMMIT
                    Usage    RegionUsagePageHeap
                    Handle   016c1000

这时候我们通过new得到的内存就刚好在heap块的边界处,这样一旦越界访问,程序就自然报错了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值