注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

C++中 调试 未处理的异常程序退出错误  

2012-10-18 18:21:59|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最近碰到过几次 “未捕获异常”导致程序退出的错误,每次都没注意。不知道是这种自己应用抛出的异常来得。而且每次异常,好像程序都会退出,调试器没能中断下来,拿到堆栈。后来才注意到输出窗口说是未处理的异常来得。这个是在windows 2008上看到的。好像本地xp 很清楚的显示是 未处理的异常啊?  visual studio 2010 的调试器和 visual studio 2008 调试器的区别来的? 


      windows系统的注册表里面是有一项 设置 程序崩溃退出时,使用那个调试器的。这里就不说了。

下面简单记录一下,便于以后引起注意。 程序崩溃时的本机的  just in time debugger窗口,显示的很清楚是一个未处理的异常。

C++中 调试 未处理的异常程序退出错误 - widebright - widebright的个人空间
 


调试的时候,可以看到在输出窗口看到这样的输出信息。


First-chance exception at 0x7c812afb (kernel32.dll) in test.exe: Microsoft C++ exception: MyException at memory location 0x0012fcf0..

Unhandled exception at 0x7c812afb (kernel32.dll) in test.exe: Microsoft C++ exception: MyException at memory location 0x0012fcf0..



MyException  是异常的类型。

0x0012fcf0.. 是异常的地址


在调试器中可以查看这个地址,得到异常的信息,

-(MyException *) 0x0012ff740x0012ff74 {error=1234 }MyException *

error1234int




如果没办法使用调试器,中断下来,就只能在代码里面找看是 哪个地方 throw MyException   了。没发现什么好办法。

因为实际调试时,发现有时还没来得及启动调试器,程序就退出了,没注意是不是某个线程退出而已?需要切换线程?

如果来不及启动调试器,我喜欢在throw  的地方,前面再加上MessageBox让程序中断下来,这样我就能在程序退出之前,去启动调试器了。



调试版本的堆栈很清楚。

 kernel32.dll!_RaiseException@16()  + 0x52 bytes

 msvcr100d.dll!_CxxThrowException(void * pExceptionObject, const _s__ThrowInfo * pThrowInfo)  Line 157C++

>test.exe!test()  Line 31C++

 test.exe!main(int __formal, int __formal)  Line 38C++

 test.exe!__tmainCRTStartup()  Line 555 + 0x19 bytesC

 test.exe!mainCRTStartup()  Line 371C

 kernel32.dll!_BaseProcessStart@4()  + 0x23 bytes





release 版本的话,实际应用中发现,很多堆栈都是不对的,抛出异常的几层函数都没有记录下来。但下面简单的测试这个堆栈都是对的。

总是有点帮助吧。 以前破解程序经常说抛出异常了加强代码被破解的难度,估计成堆栈是受影响的。实际应用中也发现有问题,不是很准确,不过简单的测试程序总是很对。


 kernel32.dll!_RaiseException@16()  + 0x52 bytes

 msvcr100.dll!_CxxThrowException()  + 0x45 bytes

 [Frames below may be incorrect and/or missing, no symbols loaded for msvcr100.dll]

>test.exe!main(int __formal, int __formal)  Line 37 + 0x15 bytesC++            这个还是有用的。

 test.exe!__tmainCRTStartup()  Line 555 + 0x17 bytesC

 kernel32.dll!_BaseProcessStart@4()  + 0x23 bytes





第二次测试,等程序出错时在加载调试器

 msvcr100.dll!_crt_debugger_hook() 

 [Frames below may be incorrect and/or missing, no symbols loaded for msvcr100.dll]

 msvcr100.dll!_wmktemp()  + 0x1b1 bytes

 msvcr100.dll!abort()  + 0x28 bytes

 test.exe!__CxxUnhandledExceptionFilter(_EXCEPTION_POINTERS * pPtrs)  Line 72C++

 kernel32.dll!_UnhandledExceptionFilter@4()  + 0x1c7 bytes

 kernel32.dll!_BaseProcessStart@4()  + 0x2c8a6 bytes

 kernel32.dll!__except_handler3()  + 0x61 bytes

 ntdll.dll!ExecuteHandler2@20()  + 0x26 bytes

 ntdll.dll!ExecuteHandler@20()  + 0x24 bytes

 ntdll.dll!_KiUserExceptionDispatcher@8()  + 0xe bytes

 kernel32.dll!_RaiseException@16()  + 0x52 bytes

 msvcr100.dll!_CxxThrowException()  + 0x45 bytes

>test.exe!main(int __formal, int __formal)  Line 37 + 0x15 bytesC++                                这个箭头还是有用的啊。

 test.exe!__tmainCRTStartup()  Line 555 + 0x17 bytesC

 kernel32.dll!_BaseProcessStart@4()  + 0x23 bytes


  评论这张
 
阅读(1545)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017