#line-numbers #symbol-table #module #symbols #information #microsoft

pdb

Microsoft PDB (程序数据库) 调试信息的解析器

16 个版本

0.8.0 2022 年 6 月 8 日
0.7.0 2021 年 3 月 2 日
0.6.0 2020 年 3 月 18 日
0.5.0 2019 年 6 月 28 日
0.1.3 2017 年 3 月 12 日

#69 in 调试

Download history 5633/week @ 2024-03-14 5898/week @ 2024-03-21 6536/week @ 2024-03-28 7075/week @ 2024-04-04 7159/week @ 2024-04-11 6476/week @ 2024-04-18 6594/week @ 2024-04-25 7242/week @ 2024-05-02 5514/week @ 2024-05-09 5728/week @ 2024-05-16 5608/week @ 2024-05-23 7338/week @ 2024-05-30 6552/week @ 2024-06-06 5860/week @ 2024-06-13 4587/week @ 2024-06-20 4548/week @ 2024-06-27

23,289 每月下载量
用于 36 个包 (直接使用 18 个)

MIT/Apache

475KB
9K SLoC

pdb

Build Status

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

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

在 docs.rs 上的文档.

设计

pdb 的设计目标与 gimli 类似

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

  • pdb 只解析您所请求的内容。

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

使用示例

use pdb::FallibleIterator;
use std::fs::File;

fn main() -> pdb::Result<()> {
    let file = File::open("fixtures/self/foo.pdb")?;
    let mut pdb = pdb::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(pdb::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