首页
社区
课程
招聘
[求助]什么样的C++错误是可以忽略的?
发表于: 2017-10-12 10:02 3659

[求助]什么样的C++错误是可以忽略的?

2017-10-12 10:02
3659

别人做的程序崩溃,我做了个dll,并设置UEH捕获无法处理的异常,一般是系统异常如0xC0000005这种异常,更改一下EIP和esp,返回值eax根据函数的定义(如BOOL的就返回FALSE),跳过出错的地方就可以避免崩溃了。但对于C++异常,就彻底没辙,因为它出错的地方是栈中某个返回地址的主程序(或某个dll)领空抛出的异常,如何定位这个地址?定位后如何消除异常,并原函数继续执行?

有一次某个无法处理的C++异常,我以为会崩溃了,UEH返回EXCEPTION_CONTINUE_SEARCH,居然也没有崩溃,真奇怪。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 878
活跃值: (496)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
没崩溃可能是UEH意外拦截了有对应Handler的异常,  EXCEPTION_CONTINUE_SEARCH之后才能被处理.
C++异常是人为抛出的,  一般情况下不是崩溃的原因
2017-10-12 10:38
0
雪    币: 7360
活跃值: (477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
C++异常过滤函数先于系统异常过滤函数处理,在C++异常过滤函数不处理他的时候才用EXCEPTION_CONTINUE_SEARCH抛出到系统过滤函数.(新手理解,可能不对,仅供参考)
问:ueh是什么?
2017-10-12 11:06
0
雪    币: 12663
活跃值: (3172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
topLevelExceptionFilter
2017-10-12 12:49
0
雪    币: 7360
活跃值: (477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
c++程序在初始化运行时库的时候会注册自己的异常过滤程序,在程序中可以注册一个对于进程中所有的线程的异常过滤程序,之后是系统异常过滤程序.
1.c++的异常过滤程序
2.注册的进程过滤程序,
3.系统过滤程序.
topLevelExceptionFilter这个是2吗
2017-10-12 13:11
0
雪    币: 12663
活跃值: (3172)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
1.VEH  VectoredExceptionHandler优于所有SEH,但什么异常都处理显然暂时没能力,而且也会拖慢程序运行。
2.SEH  程序的作者设置的异常处理,包括C++异常也是用这种机制,但好像C++会位于SEH链的顶端,优先处理?
3.UEH  所有无法处理的异常最后都会调用它,用于dmp,优雅地结束进程;我不想它崩溃啊?
2017-10-12 17:11
0
雪    币: 7360
活跃值: (477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
veh与seh是并行的异常处理机制.感觉你的seh和ueh没什么区别,你把处理的异常归到了seh,把未处理异常归到了ueh
我又看了遍书
下面都是对未处理异常的描述;
UnhandledExceptionFilter() 系统过滤函数
TopLevelUnhandledExceptionFilter()自己实现
SetUnhandledExceptionFilter()
      个人认为所有的未处理异常在抛出后,到达的都是 UnhandledExceptionFilter(),实在没办法处理后也是从 UnhandledExceptionFilter()出去,到达windows错误报告.
而在程序中可以用 SetUnhandledExceptionFilter()把 TopLevelUnhandledExceptionFilter()注册到 UnhandledExceptionFilter()的执行步骤中去.
UnhandledExceptionFilter() 的执行步骤中会检查是否注册了 TopLevelUnhandledExceptionFilter() ,如果注册就执行,并对 TopLevelUnhandledExceptionFilter()返回的EXCEPTION_EXCEUTE_HANDLER或 EXCEPTION_CONTINUE_EXECUTION,由 UnhandledExceptionFilter() 直接返回给系统.如果 TopLevelUnhandledExceptionFilter() 还返回EXCEPTION_CONTINUE_SEARCH,基本就是附加调试器或终止程序了(即 UnhandledExceptionFilter() 与windows错误报告的交互).
       在自己实现的 TopLevelUnhandledExceptionFilter()或其他的异常过滤程序的函数中可能会调用 UnhandledExceptionFilter()而构成循环调用,所以可在自己的函数中用 SetUnhandledExceptionFilter(null)把注册在 UnhandledExceptionFilter()中的 TopLevelUnhandledExceptionFilter()还原成 UnhandledExceptionFilter().
       C++异常在编译时被转化成windows结构化异常
       C++初始化(C++运行库)程序会用 SetUnhandledExceptionFilter()注册自己的 TopLevelUnhandledExceptionFilter(), SetUnhandledExceptionFilter()会返回前一个 TopLevelUnhandledExceptionFilter()的地址.
新手,以上是windows核心编程第五版的内容理解.
2017-10-13 19:27
0
游客
登录 | 注册 方可回帖
返回