【发布时间】:2021-03-19 22:59:00
【问题描述】:
我很好奇 Windows 如何处理异常。更准确地说,Windows 如何找到 try/catch 的 catch 块。我看到编译器在汇编中为 catch 块创建了一个单独的函数。由于 catch 块由汇编中的另一个函数表示,因此我无法找到生成异常的指令与 .pdata 部分的 RUNTIME_FUNCTION 条目之间的任何关联。
我尝试在 RaiseException、RtlRaiseException 和 RtlVirtualUnwind 上设置断点,但我只能找到 RaiseException 调用之后的地址。尝试调试除以 0 异常,但调试器似乎有一些额外的异常处理程序,并且未打印 catch 块中的消息。
欢迎提供有关 Windows 64 位堆栈展开的任何其他信息:D。
【问题讨论】:
-
RtlVirtualUnwind 访问了 Runtime_Function 数据,我认为您无法调试它,因为这是调试器与异常处理机制交互的内部机制,从而给您一种简单的 goto on error 错觉。这一点都不简单,因为您需要知道方法中每条指令的确切堆栈布局,才能在堆栈上找到返回地址。这就是 Runtime_Function 数据的用途。
-
当我在玩那些东西时,请从一些指针中查看web.archive.org/web/20160306065103/http://geekswithblogs.net/…。有些链接可能仍然有效。
标签: windows exception 64-bit stack-unwinding