主要内容总结:
Setup:通过示例代码展示 Rust 中不同的 panic 处理情况,包括无异常处理的
do_panic
、有异常处理的some_func
和捕获异常的do_catch_panic
,并介绍了编译和调试过程。- 编译代码时使用
cg_clif
并启用 unwind,生成link
、mir
和llvm-ir
文件,然后在调试器中设置断点进行分析。
- 编译代码时使用
- Unwinding ABI crash course:介绍了 C++异常和 Rust 恐慌处理中仍在使用的两种主要 unwind ABI,即 Windows 上的 SEH 和大多数 Unix 系统上的 Itanium unwind ABI,它们都实现了两阶段 unwind,并通过 personality 函数和 LSDA 来处理异常。
- Unwinding without exception handlers:以
do_panic
函数为例,展示了 Itanium unwind 支持在 cg_clif 中的实现,包括 personality 函数和 LSDA 的信息,以及在调试器中的验证。 - Unwinding with an exception handler:对于有异常处理的
some_func
函数,clif ir 中使用try_call
来处理异常,在调试器中可以看到 personality 函数如何设置 landingpad 和相关寄存器,以及执行流程的跳转。 - Catching an exception:
catch_unwind
在 Cranelift IR 中的实现,通过try_call_indirect
和tag1
来表示异常捕获,在 unwind 表中也有相应的表示,最后在调试器中进行了验证。 - Conclusion:总结了 cg_clif 中异常处理的工作方式,目前该功能默认禁用,可通过跟踪问题了解进展。
- Appendix:提供了一个 gdb 脚本,用于重现调试会话,包括设置断点、运行程序、查看寄存器等操作。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。