#dwarf #debugging #elf #debug-info

no-std bin+lib dwat

访问 DWARF v4/v5 类型信息的库

14 个版本 (5 个重大更新)

0.6.4 2024 年 3 月 24 日
0.6.3 2024 年 1 月 13 日
0.5.0 2024 年 1 月 7 日
0.4.2 2024 年 1 月 6 日
0.1.3 2024 年 1 月 2 日

#9 in #debug-info

Download history 56/week @ 2024-07-27

每月 56 次下载

BSD-2-Clause

94KB
2.5K SLoC

dwat

一个性能较好的库,旨在使 DWARF (v4/v5) 调试信息更容易访问。

到目前为止,我的重点是使 DWARF 信息中存在的类型信息(特别是结构体)更容易使用,因此与此相关的功能在此阶段得到了大量实现。

当前功能:

  • 按名称获取类型列表
  • 按名称获取类型映射
  • 按名称查找类型
  • 将解析的结构体和联合体信息格式化为 C 风格定义
  • 获取结构体/联合体的成员
  • 获取修饰符的底层类型(易失性/常量等...)
  • 获取类型的字节大小信息
  • 获取位字段结构体成员的位大小

CLI

尽管 dwat 主要是一个库,但包含了一个基本的 CLI

Usage: dwat <COMMAND>

Commands:
  lookup  Find and display a single struct
  dump    Find and display all structs
  help    Print this message or the help of the given subcommand(s)

Options:
  -h, --help  Print help

Python 绑定

dwat 有 Python 绑定!文档可以在这里找到:https://zolutal.github.io/dwat/

示例

examples 目录中有几个值得查看的示例。

使用方法

使用库的第一步是将包含 DWARF 信息的文件加载到内存中,然后调用 Dwarf::load

    let file = File::open(path)?;
    let mmap = unsafe { Mmap::map(&file) }?;

    let dwarf = Dwarf::load(&*mmap)?;

DWARF 对象有一个 lookup_type 方法,可以用来按名称查找任何实现了 Tagged 特质的类型,在这种情况下将搜索结构体

    let found = dwarf.lookup_type::<dwat::Struct>(struct_name)?;

可以通过调用 .members() 来检索结构体成员,该方法返回一个 Member 结构体的 Vector。

    let members = struc.members(&dwarf)?;

可以通过调用 to_string 函数将结构体对象转换为 C 风格定义的字符串

    if let Some(found) = found {
        println!("{}", found.to_string(&dwarf)?);
    }

依赖项

~5–15MB
~209K SLoC