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

如何在Windows中捕获RSP和RIP损坏异常?,windows,winapi,exception-handling,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 使用SetUnh

我正在为我的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\u av

使用
AddVectoredExceptionFilter
,我只能捕获
crash\u av
trash\u rip


但我根本不知道有什么方法可以抓住垃圾。可能吗?是否还有其他我应该注意的碰撞场景?是否有一种规范的方法可以可靠地捕获所有这些崩溃?

在发生异常的线程上下文中执行的任何异常处理程序。如果
trash\u rsp
-让我们问问-当异常开始处理时,哪个必须是
rsp
(堆栈指针)?当您损坏
rsp
(超出堆栈空间)时,您的进程的游戏结束了。任何内部处理程序都无法从此恢复

如果
SetUnhandledExceptionFilter
存在一个点-仅当调试器未连接到进程时调用。因此,如果附加了调试器,则不调用。如果未连接调试器,则必须为
crash\u av
trash\u rip
调用坏测试。否则,不能同时要求两者

AddVectoredExceptionHandler
调用任何异常(除了堆栈空间外的rsp)独立于附加的调试器或否。当然,如果调试器第一次未处理异常,而另一个
AddVectoredExceptionHandler
未在您的

之前处理异常,则无法捕获“崩溃”。可以截获未处理的SEH异常,但您的代码可能会或可能不会引发SEH异常。