• 7415阅读
  • 3回复

windows程序异常捕获与处理 例子 [复制链接]

上一主题 下一主题
离线myer
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2011-12-31

       程序免不了bug,尤其在多线程的程序中,有时候程序异常退出很不易重现,为了重现bug,夜以继日的测试,下面介绍一个简单的方法,捕获未处理异常,然后视软件设计者意图,自动重启,或者等待处理,或者其它都自便。
       异常发生时,同时保存两个log文件,一个为text格式,指出错误发生所在代码行,一个为dump调试文件,MiniDump格式,可以用Visual studio打开重现当时的堆栈状况。      下图为例子程序,点击按钮,产生一个写0地址的异常,这是为处理的情况:
window.open('http://www.qtcn.org/bbs/attachment/Mon_1112/44_534_cdd80fcc256a4d8.png?15');" style="max-width:700px;max-height:700px;" onload="if(is_ie6&&this.offsetWidth>700)this.width=700;" >
下图为debug版本的程序,处理异常,直接显示异常代码位置,exceptiontest.cpp的第16行:



下两图为release版本,由于没有pdb信息,指出异常代码位置 0001:000025cd,打开map文件很方便的看出,程序执行到了on_pushButton_clicked函数


如果需要进一步了解,欢迎关注qtcn论坛,或者联系我:QQ 56430808 。
exceptionhander.rar (101 K) 下载次数:158
完。
http://user.qzone.qq.com/56430808
离线inside
只看该作者 1楼 发表于: 2011-12-31
希望能够提供  pdump的代码
离线inside
只看该作者 2楼 发表于: 2011-12-31
WheatyExceptionReport::WheatyExceptionReport(void)                                                                             .text 000006C4 00000029 R . . . B . .
WheatyExceptionReport::~WheatyExceptionReport(void)                                                                            .text 000006F4 00000017 R . . . B . .
WheatyExceptionReport::GenerateMiniDumps(_EXCEPTION_POINTERS *)                                                                .text 00000714 00000219 R . . . B . .
WheatyExceptionReport::WheatyUnhandledExceptionFilter(_EXCEPTION_POINTERS *)                                                   .text 00000934 000002EA R . . . B T .
WheatyExceptionReport::GenerateExceptionReport(_EXCEPTION_POINTERS *)                                                          .text 00000C24 00000286 R . . . B . .
WheatyExceptionReport::GetExceptionString(ulong)                                                                               .text 00000EB4 0000014F R . . . B T .
WheatyExceptionReport::GetLogicalAddress(void *,char *,ulong,ulong &,ulong &)                                                  .text 00001154 00000103 R . . . B T .
WheatyExceptionReport::WriteStackDetails(_CONTEXT *,bool)                                                                      .text 00001264 00000303 R . . . B T .
WheatyExceptionReport::EnumerateSymbolsCallback(_SYMBOL_INFO *,ulong,void *)                                                   .text 00001574 000000C7 R . . . B T .
WheatyExceptionReport::FormatSymbolValue(_SYMBOL_INFO *,_tagSTACKFRAME *,char *,uint)                                          .text 00001644 00000140 R . . . B . .
WheatyExceptionReport::DumpTypeIndex(char *,unsigned __int64,ulong,uint,ulong,bool &)                                          .text 00001784 000002AB R . . . B T .
`WheatyExceptionReport::DumpTypeIndex(char *,unsigned __int64,ulong,uint,ulong,bool &)'::`7'::FINDCHILDREN::FINDCHILDREN(void) .text 00001A34 00000017 R . . . B . .
WheatyExceptionReport::FormatOutputValue(char *,BasicType,unsigned __int64,void *)                                             .text 00001A54 00000178 R . . . B T .
WheatyExceptionReport::GetBasicType(ulong,unsigned __int64)                                                                    .text 00001BD4 0000007E R . . . B T .
WheatyExceptionReport::printf(char const *,...)                                                                                .text 00001C54 0000007F R . . . B T .
楼主写的功能很全面 希望公开出来 大家一起完善 。。我就不逆 了。或者单独发我一份  909152171  谢谢
离线chisely
只看该作者 3楼 发表于: 2012-01-02
不是qt的异常处理啊
快速回复
限100 字节
 
上一个 下一个