11 个版本
0.1.9 | 2023 年 12 月 7 日 |
---|---|
0.1.8 | 2023 年 8 月 29 日 |
0.1.7 | 2023 年 6 月 28 日 |
0.1.4 | 2023 年 3 月 3 日 |
0.1.1 | 2022 年 6 月 16 日 |
#225 在 开发工具
52 每月下载
在 6 个crate(2个直接)中使用
16KB
266 行
atomic-dbg
此crate提供dbg
、eprint
和eprintln
宏,它们的工作方式与std中的对应宏类似,但它们
- 以原子方式写入,最长可达平台支持的长度。
- 不使用锁(在用户空间)或动态分配。
- 保留libc的
errno
和Windows的最后一个错误代码值。
这意味着它们可以在程序的几乎所有地方使用,包括在分配器实现中、在同步原语中、在启动代码中、在FFI调用周围、在信号处理器中以及在fork
之前一个exec
的子进程中。
并且,当多个线程打印时,只要它们在平台支持的长度内,输出是可读的,而不是可能与其他输出交织。
例如,这段代码
use atomic_dbg::dbg;
fn main() {
dbg!(2, 3, 4);
}
有这个strace输出
write(2, "[examples/dbg.rs:4] 2 = 2\n[examples/dbg.rs:4] 3 = 3\n[examples/dbg.rs:4] 4 = 4\n", 78[examples/dbg.rs:4] 2 = 2
这是一个单一的原子write
调用。
与此相比,使用std::dbg
看起来像这样
write(2, "[", 1[) = 1
write(2, "examples/dbg.rs", 15examples/dbg.rs) = 15
write(2, ":", 1:) = 1
write(2, "4", 14) = 1
write(2, "] ", 2] ) = 2
write(2, "2", 12) = 1
write(2, " = ", 3 = ) = 3
write(2, "2", 12) = 1
write(2, "\n", 1
) = 1
write(2, "[", 1[) = 1
write(2, "examples/dbg.rs", 15examples/dbg.rs) = 15
write(2, ":", 1:) = 1
write(2, "4", 14) = 1
write(2, "] ", 2] ) = 2
write(2, "3", 13) = 1
write(2, " = ", 3 = ) = 3
write(2, "3", 13) = 1
write(2, "\n", 1
) = 1
write(2, "[", 1[) = 1
write(2, "examples/dbg.rs", 15examples/dbg.rs) = 15
write(2, ":", 1:) = 1
write(2, "4", 14) = 1
write(2, "] ", 2] ) = 2
write(2, "4", 14) = 1
write(2, " = ", 3 = ) = 3
write(2, "4", 14) = 1
write(2, "\n", 1
) = 1
atomic-dbg 是 no_std
,然而像 std
一样,它使用stderr文件描述符环境,假设它是打开的。
日志记录
启用“log”功能后,atomic-dbg定义了一个atomic_dbg::log::init
,它使用eprintln
宏安装了一个最小的日志实现。
依赖关系
~1–11MB
~130K SLoC