首先,有两种处理方式
- 自解绑
Unwinding
(默认)。即,沿着【函数-调用栈】,由rust
程序自身逐一释放每一个正在被调用函数所占用的内存。 - 立即结束进程
Abort
,由操作系统(或wasm
的宿主【浏览器】)负责进程内存的回收。
其次,上述两种处理方式的优缺点包括
- 自解绑
Unwinding
能够提供-
【程序崩溃】自描述信息(如果被提供的话)
-
【程序崩溃】的位置信息,包括:
- 文件名
- 行号
- 列号
-
【程序崩溃】发生时的【函数-调用栈】(术语:回溯
backtrace
),若在程序编译时,准备了如下配置:- 首先,设置了环境变量
RUST_BACKTRACE=1
- 其次,开启了【
DEBUG
模式】(即,在cargo build/run
指令里不添加--release
命令行参数)。
这个信息对推测崩溃原因很有帮助。
- 首先,设置了环境变量
-
立即结束进程
Abort
能够让编译输出的二进制文件“体积”更小。【
wasm
的web
使用场景】表示很中意。
-
接着,rustc
提供给开发者三种途径来指定如何处理【程序崩溃】
-
在
Cargo.toml
文件中的(如下)配置项。针对【产品-分发包】,开启Abort
崩溃退出模式。[profile.release] panic = "abort"
- 配置发生于:编译时。
-
在
rust
代码内的#[panic_handler]
元属性。由此元属性修饰的函数fn(&PanicInfo) -> ! {...}
将会重写来自【标准库std
】的【程序崩溃panic
】默认处理行为。- 配置发生于:编译时。
- 全域至多只能有一个
#[panic_handler]
元属性。
-
调用
std::panic::set_hook(Box<dyn Fn(&PanicInfo<'_>) + Sync + Send + 'static>)
函数,挂载【程序崩溃panic
】处理闭包。- 配置发生于:运行时。
- 新挂载的处理闭包会替换旧挂载的闭包。
- 若多次调用
set_hook
函数挂载panic
处理闭包,则只有最后一次被挂载的处理闭包会生效。
1
共 0 条评论, 1 页
评论区
写评论还没有评论