11个不稳定版本 (3个破坏性更新)

0.4.0 2023年8月21日
0.3.0 2023年5月19日
0.2.4 2023年4月7日
0.2.3 2022年7月26日
0.1.1 2022年2月24日

#1541 in 嵌入式开发

Download history 4/week @ 2024-03-14 9/week @ 2024-03-28 4/week @ 2024-04-04 1/week @ 2024-05-16 2/week @ 2024-05-23

每月 69 次下载
stackdump-cli 中使用

MIT/Apache

195KB
4K SLoC

Stackdump Trace

crates.io Documentation

此包实现了使用 stackdump-capture 包捕获的内存中的堆栈跟踪。

另请参阅 主仓库的 README

目标是尽可能从捕获的内存中提取信息。因此,不仅提供了堆栈帧,还提供了每个帧中存在的变量。只有当这些变量的内存被捕获时,才能读取这些变量的值。

此包所需的最少是堆栈和寄存器捕获。但如果发现任何指向堆栈之外的变量,例如 String,则还需要捕获堆内存。否则,它只会显示指针值。

目前,仅支持 cortex m 目标。大量代码可以重构以跨平台工作。

如果您想添加一个目标,请讨论并创建问题或 PR。

示例

在这种情况下,我们有一个具有 FPU 的 cortex m 目标。首先进行了两个寄存器捕获,然后是堆栈捕获。

# use stackdump_core::device_memory::DeviceMemory;
# use stackdump_core::register_data::VecRegisterData;
# use stackdump_core::memory_region::VecMemoryRegion;
# use stackdump_trace::platform::cortex_m::CortexMPlatform;
# use stackdump_trace::render_colors::Theme;

let dump: Vec<u8> = todo!(); // Get your dump from somewhere
let elf: Vec<u8> = todo!(); // Read your elf file

let mut dump_iter = dump.iter().copied();

let mut device_memory = DeviceMemory::new();

device_memory.add_register_data(VecRegisterData::from_iter(&mut dump_iter));
device_memory.add_register_data(VecRegisterData::from_iter(&mut dump_iter));
device_memory.add_memory_region(VecMemoryRegion::from_iter(&mut dump_iter));

let frames = stackdump_trace::platform::trace::<CortexMPlatform>(device_memory, &elf).unwrap();

for (i, frame) in frames.iter().enumerate() {
    println!("{}: {}", i, frame.display(true, false, false, Theme::Dark));
}

从设备实时读取

原则上,如果您有直接读取设备内存的方法(例如,通过 probe-rs),则可以创建实现 RegisterDataMemoryRegion 的类型,以便可以将它们插入到 DeviceMemory 实例中。

依赖项

~5–15MB
~173K SLoC