2 个版本
0.9.1 | 2024 年 6 月 5 日 |
---|---|
0.9.0 | 2023 年 8 月 1 日 |
#283 在 解析器实现 中
1,625 每月下载量
在 6 个 crate 中使用 (通过 pdb-addr2line)
475KB
9K SLoC
pdb2
此仓库是从 willglynn/pdb 分叉并发布为 pdb2
crate。
这是一个解析 Microsoft PDB (程序数据库) 文件的 Rust 库。这些文件包含大多数针对 Windows 的编译器产生的调试信息,包括符号、类型、模块等信息。
PDB 格式本身没有文档,但微软已以 C++ 代码的形式发布了有关其使用的信息。PDB 格式充满了...历史,包括对 16 位可执行文件的调试、COBOL 用户定义类型以及众多其他功能。 pdb2
并不完全理解 PDB 格式的所有内容,但它涵盖了足够的内容,足以适用于今天编译的典型程序。
设计
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 License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
您可以选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义,您有意提交的任何贡献,将以上述方式双重许可,不附加任何额外条款或条件。
依赖关系
~410KB