我正在为我的Windows桌面应用程序开发崩溃处理系统,并且不确定捕获一些异常的最佳方法。以下是3个崩溃的简单函数:
crash_av proc
xor rax, rax
mov qword ptr [rax], 0
ret
crash_av endp
trash_rip proc
push 0
push 0
ret
trash_rip endp
trash_rsp proc
xor rsp, rsp
ret
trash_rsp endp
使用SetUnhandledExceptionFilter
,我只能抓住crash_av
。
使用AddVectoredExceptionFilter
,我只能抓住crash_av
和trash_rip
。
但我根本没有意识到有任何方法可以抓住trash_rsp
。可能吗?我还应该注意其他崩溃情况吗?是否有规范方法可靠地捕获所有这些崩溃?
答案 0 :(得分:0)
在线程上下文中执行的任何异常处理程序,其中发生了异常。如果trash_rsp
- 请问 - 当异常开始处理时,哪个必须是rsp
(堆栈指针)?当你损坏rsp
(走出堆栈空间)时 - 你的过程游戏结束了。任何内部处理程序都无法从中恢复。
如果SetUnhandledExceptionFilter
存在一个点 - UnhandledExceptionFilter
仅在调试器未附加到您的进程时调用。所以如果连接调试器 - UnhandledExceptionFilter
没有被调用。如果没有附加调试器,则必须同时为crash_av
和trash_rip
调用错误测试UnhandledExceptionFilter
。否则不得为两者都要求。
AddVectoredExceptionHandler
调用任何异常(除了rsp超出堆栈空间)独立于调试器附加或否。当然,如果调试器在第一次机会时没有处理异常而另一个AddVectoredExceptionHandler
在你的