如何在Windows中捕获RSP和RIP损坏异常?
我正在为我的Windows桌面应用程序开发一个崩溃处理系统,不确定捕获某些异常的最佳方法。以下是3个会崩溃的简单函数:如何在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
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异常。