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 解析器实现
15,020 每月下载量
在 3 个crate中使用 (2 个直接使用)
205KB
3.5K SLoC
提供读取便携式PDB文件的支持,特别是函数的行信息解析。
便携式PDB 是通用语言基础设施 (CLI) 语言的调试信息文件格式。它是 ECMA-335 格式 的扩展。
功能
- 使用
PortablePdb::parse
解析便携式PDB文件。 - 使用
PortablePdbCacheConverter::process_portable_pdb
将便携式PDB文件转换为PortablePdbCaches
。 - 使用
PortablePdbCacheConverter::serialize
序列化PortablePdbCaches
并使用PortablePdbCache::parse
解析它们。 - 使用
PortablePdbCache::lookup
在PortablePdbCache
上查找函数的行信息。
示例
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