1个不稳定版本
0.3.0 | 2020年12月15日 |
---|
#45 in #dwarf
用于 ddbug
275KB
7K SLoC
ddbug - 显示调试信息
ddbug
是一个用于使用DWARF调试信息探索代码生成方面的工具,特别是用于查看代码生成如何因源代码更改或编译器选项更改而发生变化。
特性
- 类型大小和布局
- 函数类型、大小、内联函数、函数调用和反汇编
- 显示两个文件之间的差异
- 纯文本或HTTP/HTML输出
- 选项以过滤/排序纯文本输出
这是alpha软件。它可能包含许多错误和不完整的特性。尽管如此,它仍然处于可以提供一些用途的状态。欢迎提交错误报告和特性请求。
支持
- 带有DWARF的ELF文件
- 带有DWARF的Mach-O文件
安装
安装 Rust 后,运行
cargo install --git https://github.com/gimli-rs/ddbug
运行
找到包含调试信息的文件,然后运行
ddbug path-to-file
有关控制显示哪些信息的选项的详细信息,请参阅 ddbug --help
。
通常您会希望在对仍包含调试信息的优化二进制文件上运行 ddbug
。对于 rust,您可以使用以下方式构建代码:
RUSTFLAGS=-g cargo build --release
差异模式
当给定 --diff
选项和两个文件路径时,ddbug
将显示两个二进制文件之间的差异。有一些命令行选项可以指定哪些差异被认为是重要的。通常,您至少会想要忽略地址(--i address
)。
示例输出
结构和联合
struct core::fmt::Formatter
size: 96
members:
0[16] width: union core::option::Option<usize>
16[16] precision: union core::option::Option<usize>
32[16] buf: struct core::fmt::&mut Write
48[16] curarg: struct core::slice::Iter<core::fmt::ArgumentV1>
64[16] args: struct &[core::fmt::ArgumentV1]
80[4] flags: u32
84[4] fill: char
88[1] align: enum core::fmt::rt::v1::Alignment
89[7] <padding>
枚举
请注意,这是一个C样式枚举。Rust枚举在调试信息中既作为联合体也作为枚举进行编码。
enum core::result::Result
size: 1
enumerators:
Ok(0)
Err(1)
函数
fn ddbug::main
linkage name: _ZN5ddbug4mainE
address: 0x601f0-0x629d9
size: 10218
inlined functions:
[30] log::__static_max_level
[59] log::max_log_level
calls:
0x40eee0 env_logger::init
0x48870 core::result::Result<(), log::SetLoggerError>::ok<(),log::SetLoggerError>
fn log::__static_max_level
linkage name: _ZN3log18__static_max_levelE
inline: yes
return type:
[8] enum log::LogLevelFilter
许可证
本软件根据以下之一进行许可:
- Apache许可证第2版 (
LICENSE-APACHE
) - MIT许可证 (
LICENSE-MIT
)
由您选择。
除非您明确说明,否则您有意提交以包含在本作品中的任何贡献,根据Apache-2.0许可证定义,应按上述方式双重许可,不附加任何额外条款或条件。
lib.rs
:
用于解析调试信息的库。
示例用法
ddbug_parser::File::parse(a_file_path, |file| {
for unit in file.units() {
for function in unit.functions() {
if let Some(name) = function.name() {
println!("{}", name);
}
}
}
Ok(())
});
依赖项
~4MB
~78K SLoC