6个版本 (稳定版)
1.0.3 | 2024年2月22日 |
---|---|
1.0.2 | 2024年2月12日 |
1.0.0 | 2023年12月13日 |
0.2.0 | 2023年9月21日 |
0.1.1 | 2022年10月26日 |
#93 在 操作系统 分类中
每月 12,213 次下载
24KB
488 行
MicroSEH 🔴
MicroSEH 是一个小型库,实现了Rust中的结构化异常处理(SEH),可以捕获和处理硬件异常。
为什么?
硬件异常是针对特定用例的非常强大的工具。其中一个用例是在运行时检测和处理非法指令。
实现
事实证明,在纯Rust中实现SEH有其自身的问题(如NAMAZSO在这篇文章中所述:https://engineering.zeroitlab.com/2022/03/13/rust-seh)
此库采用不同的、更简单的方法,即使用一个调用Rust的 C
桩,并用 __try __except
块包装调用。
用法
将以下内容添加到您的 Cargo.toml
[dependencies]
microseh = "1.0"
最小示例:在程序崩溃的情况下引用无效指针,并返回处理后的异常。
fn guarded() -> Result<(), Box<dyn Error>> {
microseh::try_seh(|| unsafe {
// Read from an unallocated memory region. (we create an aligned not-null
// pointer to skip the checks in read_volatile that would raise a panic)
core::ptr::read_volatile(core::mem::align_of::<i32>() as *const i32);
})?;
}
访问异常数据:您可以获取异常的地址和寄存器转储。
if let Err(ex) = microseh::try_seh(|| unsafe {
// *questionable life choices go here*
}) {
println!("address: {:x}", ex.address());
println!("rax: {:x}", ex.registers().rax());
}
有关更多示例和实际用例,请访问示例 目录!
可移植性
SEH 是由Microsoft开发的C语言的扩展,在Microsoft Visual C++(MSVC)使用时仅在Windows上可用。
MicroSEH 与以下架构的Windows平台兼容并已过测试: x86、x86_64 和 aarch64。
无运行时依赖
~180KB