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 嵌入式开发
每月 69 次下载
在 stackdump-cli 中使用
195KB
4K SLoC
Stackdump Trace
此包实现了使用 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),则可以创建实现 RegisterData
和 MemoryRegion
的类型,以便可以将它们插入到 DeviceMemory
实例中。
依赖项
~5–15MB
~173K SLoC