Rust 运行时

本节介绍定义 Rust 运行时某些方面的特性。

panic_handler 属性

panic_handler 属性 只能应用于签名 fn(&PanicInfo) -> ! 的函数。使用此 属性 标记的函数定义了 panic 的行为。PanicInfo 结构体包含有关 panic 位置的信息。在二进制文件、dylib 或 cdylib crate 的依赖关系图中,必须有一个 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 的实现,默认行为是展开堆栈,但可以 更改为中止进程。标准库的 panic 行为可以在运行时使用 set_hook 函数进行修改。

global_allocator 属性

global_allocator 属性 用于实现 GlobalAlloc trait 的 静态项,以设置全局分配器。

windows_subsystem 属性

windows_subsystem 属性 可以应用于 crate 级别,以在 Windows 目标上链接时设置 子系统。它使用 MetaNameValueStr 语法来指定子系统,值为 consolewindows。此属性在非 Windows 目标上以及非 bin crate 类型 上被忽略。

“console” 子系统是默认设置。如果控制台进程从现有控制台运行,则它将附加到该控制台;否则,将创建一个新的控制台窗口。

“windows” 子系统通常由不希望在启动时显示控制台窗口的 GUI 应用程序使用。它将与任何现有控制台分离运行。

#![allow(unused)]
#![windows_subsystem = "windows"]
fn main() {
}