Rust 运行时
本节介绍定义 Rust 运行时某些方面的功能。
panic_handler
属性
panic_handler
属性 只能应用于签名为 fn(&PanicInfo) -> !
的函数。标记为此 属性 的函数定义了 panic 的行为。PanicInfo
结构体包含有关 panic 位置的信息。在二进制文件、动态链接库或 cdylib 包的依赖图中必须有一个 panic_handler
函数。
下面显示了一个 panic_handler
函数,它记录 panic 消息,然后停止线程。
#![no_std]
use core::fmt::{self, Write};
use core::panic::PanicInfo;
struct Sink {
// ..
_0: (),
}
impl Sink {
fn new() -> Sink { Sink { _0: () }}
}
impl fmt::Write for Sink {
fn write_str(&mut self, _: &str) -> fmt::Result { Ok(()) }
}
#[panic_handler]
fn panic(info: &PanicInfo) -> ! {
let mut sink = Sink::new();
// logs "panicked at '$reason', src/main.rs:27:4" to some `sink`
let _ = writeln!(sink, "{}", info);
loop {}
}
标准行为
标准库提供了一个 panic_handler
的实现,默认情况下会展开堆栈,但可以 更改为中止进程。可以使用 set_hook 函数在运行时修改标准库的 panic 行为。
global_allocator
属性
global_allocator
属性 用于实现 GlobalAlloc
特征的 静态项,以设置全局分配器。
windows_subsystem
属性
windows_subsystem
属性 可以在包级别应用,以便在 Windows 目标上链接时设置 子系统。它使用 MetaNameValueStr 语法来指定子系统,其值为 console
或 windows
。在非 Windows 目标上以及非 bin
包类型 时,将忽略此属性。
“console”子系统是默认值。如果从现有控制台运行控制台进程,则它将附加到该控制台,否则将创建一个新的控制台窗口。
“windows”子系统通常由 GUI 应用程序使用,这些应用程序不希望在启动时显示控制台窗口。它将与任何现有控制台分离运行。
#![allow(unused)] #![windows_subsystem = "windows"] fn main() { }