38 个稳定版本 (3 个主要版本)

12.10.0 2024年7月24日
12.8.0 2023年12月1日
12.7.1 2023年11月29日
12.3.0 2023年7月19日
9.2.1 2022年9月30日

#676 in 解析器实现

Download history 3769/week @ 2024-05-02 2267/week @ 2024-05-09 2688/week @ 2024-05-16 2836/week @ 2024-05-23 4432/week @ 2024-05-30 3929/week @ 2024-06-06 2889/week @ 2024-06-13 1870/week @ 2024-06-20 2577/week @ 2024-06-27 2787/week @ 2024-07-04 3410/week @ 2024-07-11 3925/week @ 2024-07-18 4136/week @ 2024-07-25 3380/week @ 2024-08-01 4114/week @ 2024-08-08 2858/week @ 2024-08-15

15,020 每月下载量
3 个crate中使用 (2 个直接使用)

MIT 许可证

205KB
3.5K SLoC

提供读取便携式PDB文件的支持,特别是函数的行信息解析。

便携式PDB 是通用语言基础设施 (CLI) 语言的调试信息文件格式。它是 ECMA-335 格式 的扩展。

功能

示例

use symbolic_testutils::fixture;
use symbolic_ppdb::{LineInfo, PortablePdb, PortablePdbCacheConverter, PortablePdbCache};

let buf = std::fs::read(fixture("windows/portable.pdb")).unwrap();
let pdb = PortablePdb::parse(&buf).unwrap();

let mut converter = PortablePdbCacheConverter::new();
converter.process_portable_pdb(&pdb).unwrap();
let mut buf = Vec::new();
converter.serialize(&mut buf).unwrap();

let cache = PortablePdbCache::parse(&buf).unwrap();
let line_info = cache.lookup(7, 10).unwrap();
assert_eq!(line_info.line, 81);

便携式PDB文件的结构

ECMA-335 文件被划分为称为 的部分。可能的流包括:

  • #~ ("元数据"),包含有关类、方法、模块等信息,按照各种模式组织成表格。原始的 ECMA-335 表格在 ECMA-335 规范的第二十二章中描述,由 Portable PDB 添加的表格在 Portable PDB 规范中描述。对于 symbolic 来说,MethodDebugInformation 表格特别有趣,因为它包含函数的行信息。
  • #Strings,包含空终止的 UTF-8 字符串。
  • #GUID,GUID 列表。
  • #US ("用户字符串"),包含 UTF-16 编码的字符串。
  • #Blob,包含不适合其他任何流的字节数据。

Portable PDB 格式通过添加另一个流 #PDB 以及到 ~ 流的一些表格来扩展 ECMA-335。

依赖关系

~2.3–3.5MB
~66K SLoC