#printing #print #macro #stderr

atomic-dbg

Atomic dbg/eprintln/eprint

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开发工具

Download history 6/week @ 2024-04-07 8/week @ 2024-04-14 28/week @ 2024-04-21 4/week @ 2024-04-28 23/week @ 2024-05-12 36/week @ 2024-05-19 36/week @ 2024-05-26 15/week @ 2024-06-02 18/week @ 2024-06-09 11/week @ 2024-06-16 24/week @ 2024-06-23 7/week @ 2024-06-30 11/week @ 2024-07-07 17/week @ 2024-07-14 17/week @ 2024-07-21

52 每月下载
6crate(2个直接)中使用

Apache-2.0…

16KB
266

atomic-dbg

crates.io page docs.rs docs

此crate提供dbgeprinteprintln宏,它们的工作方式与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