如何在Windows中捕获RSP和RIP损坏异常?

时间:2017-07-24 13:40:45

标签: windows winapi exception-handling

我正在为我的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_avtrash_rip

但我根本没有意识到有任何方法可以抓住trash_rsp。可能吗?我还应该注意其他崩溃情况吗?是否有规范方法可靠地捕获所有这些崩溃?

1 个答案:

答案 0 :(得分:0)

在线程上下文中执行的任何异常处理程序,其中发生了异常。如果trash_rsp - 请问 - 当异常开始处理时,哪个必须是rsp(堆栈指针)?当你损坏rsp(走出堆栈空间)时 - 你的过程游戏结束了。任何内部处理程序都无法从中恢复。

如果SetUnhandledExceptionFilter存在一个点 - UnhandledExceptionFilter仅在调试器未附加到您的进程时调用。所以如果连接调试器 - UnhandledExceptionFilter没有被调用。如果没有附加调试器,则必须同时为crash_avtrash_rip调用错误测试UnhandledExceptionFilter。否则不得为两者都要求。

AddVectoredExceptionHandler调用任何异常(除了rsp超出堆栈空间)独立于调试器附加或否。当然,如果调试器在第一次机会时没有处理异常而另一个AddVectoredExceptionHandler在你的

之前没有处理异常