#dwarf

ddbug_parser

统一的调试信息解析器

1个不稳定版本

0.3.0 2020年12月15日

#45 in #dwarf


用于 ddbug

Apache-2.0/MIT

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.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