小明思考

高性能服务器端计算
posts - 70, comments - 428, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

使用Gflags来检测heap问题

Posted on 2008-09-27 10:59 小明 阅读(8508) 评论(5)  编辑 收藏 引用 所属分类: ToolsDebug
先说一下问题,如何让下面程序(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块的边界处,这样一旦越界访问,程序就自然报错了。



Feedback

# re: 使用Gflags来检测heap问题  回复  更多评论   

2008-09-27 15:41 by cexer
我觉得这种有点奇巧淫技的意思,不过调起BUG来真方便。多谢!

# re: 使用Gflags来检测heap问题  回复  更多评论   

2008-09-27 16:03 by 908971
mark

# re: 使用Gflags来检测heap问题  回复  更多评论   

2008-09-28 16:05 by jans2002
好!最头疼这种问题了,谢了,又学了一招。

# re: 使用Gflags来检测heap问题  回复  更多评论   

2012-09-27 11:11 by ancool
我试了,为什么我的不中断报错?

# re: 使用Gflags来检测heap问题  回复  更多评论   

2014-04-04 14:11 by yyy
@cexer
奇个鸡巴,这是中规中矩的好吧。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理