Crates.io | atomic-dbg |
lib.rs | atomic-dbg |
version | 0.1.9 |
source | src |
created_at | 2022-05-04 23:32:01.504728 |
updated_at | 2023-12-07 14:40:14.061552 |
description | Atomic `dbg`/`eprintln`/`eprint` macros |
homepage | |
repository | https://github.com/sunfishcode/atomic-dbg |
max_upload_size | |
id | 580736 |
size | 55,178 |
This crate provides dbg
, eprint
, and eprintln
, macros which work
just like their counterparts in std, but which:
errno
and Windows' last-error code value.This means they can be used just about anywhere within a program, including
inside allocator implementations, inside synchronization primitives, startup
code, around FFI calls, inside signal handlers, and in the child process of a
fork
before an exec
.
And, when multiple threads are printing, as long as they're within the length supported on the platform, the output is readable instead of potentially interleaved with other output.
For example, this code:
use atomic_dbg::dbg;
fn main() {
dbg!(2, 3, 4);
}
Has this strace output:
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
which is a single atomic write
call.
For comparison, with std::dbg
it looks like this:
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 is no_std
, however like std
, it uses the stderr file descriptor
ambiently, assuming that it's open.
With the "log" feature enabled, atomic-dbg defines an atomic_dbg::log::init
which installed a minimal logging implementation using the eprintln
macro.