2 个版本

0.9.1 2024 年 6 月 5 日
0.9.0 2023 年 8 月 1 日

#283解析器实现

Download history 872/week @ 2024-04-15 591/week @ 2024-04-22 972/week @ 2024-04-29 697/week @ 2024-05-06 899/week @ 2024-05-13 901/week @ 2024-05-20 515/week @ 2024-05-27 795/week @ 2024-06-03 496/week @ 2024-06-10 535/week @ 2024-06-17 373/week @ 2024-06-24 415/week @ 2024-07-01 278/week @ 2024-07-08 623/week @ 2024-07-15 281/week @ 2024-07-22 428/week @ 2024-07-29

1,625 每月下载量
6 个 crate 中使用 (通过 pdb-addr2line)

MIT/Apache

475KB
9K SLoC

pdb2

此仓库是从 willglynn/pdb 分叉并发布为 pdb2 crate。

Build Status

这是一个解析 Microsoft PDB (程序数据库) 文件的 Rust 库。这些文件包含大多数针对 Windows 的编译器产生的调试信息,包括符号、类型、模块等信息。

PDB 格式本身没有文档,但微软已以 C++ 代码的形式发布了有关其使用的信息。PDB 格式充满了...历史,包括对 16 位可执行文件的调试、COBOL 用户定义类型以及众多其他功能。 pdb2 并不完全理解 PDB 格式的所有内容,但它涵盖了足够的内容,足以适用于今天编译的典型程序。

docs.rs 上的文档.

设计

pdb2 的设计目标与 gimli 类似

  • pdb2 尽可能地以磁盘上原始数据的格式工作。

  • pdb2 仅解析您请求的内容。

  • pdb2 可以在任何地方读取 PDB。不依赖于 Windows、DIA SDK 或目标的本地字节序。

使用示例

use pdb2::FallibleIterator;
use std::fs::File;

fn main() -> pdb2::Result<()> {
    let file = File::open("fixtures/self/foo.pdb")?;
    let mut pdb = pdb2::PDB::open(file)?;

    let symbol_table = pdb.global_symbols()?;
    let address_map = pdb.address_map()?;

    let mut symbols = symbol_table.iter();
    while let Some(symbol) = symbols.next()? {
        match symbol.parse() {
            Ok(pdb2::SymbolData::Public(data)) if data.function => {
                // we found the location of a function!
                let rva = data.offset.to_rva(&address_map).unwrap_or_default
                println!("{} is {}", rva, data.name);
            }
            _ => {}
        }
    }

    Ok(())
}

示例程序

使用 cargo run --release --example <name>

  • pdb_symbols 是一个玩具程序,它会打印符号表中每个函数和数据值的名称和位置。

  • pdb2hpp 是一个较大的程序,它仅根据 PDB 打印请求类型的 C++ 头文件的大致内容。

  • pdb_lines 可以输出 PDB 中每个模块中每个符号的行号信息。

实际例子

  • mstange/pdb-addr2line 通过 PDB 文件将地址解析为函数名,以及文件名和行号信息,支持内联堆栈。

  • getsentry/symbolic 是一个高级符号化库,支持大多数常见的调试文件格式、解引用和更多功能。

许可证

许可协议为以下之一

您可以选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交的任何贡献,将以上述方式双重许可,不附加任何额外条款或条件。

依赖关系

~410KB