42 stable releases (3 major)
12.12.0 | Oct 1, 2024 |
---|---|
12.10.1 | Aug 28, 2024 |
12.10.0 | Jul 24, 2024 |
12.8.0 | Dec 1, 2023 |
9.2.1 | Sep 30, 2022 |
#995 in Parser implementations
14,666 downloads per month
Used in 3 crates
(2 directly)
205KB
3.5K
SLoC
Provides support for reading Portable PDB files, specifically line information resolution for functions.
Portable PDB is a debugging information file format for Common Language Infrastructure (CLI) languages. It is an extension of the ECMA-335 format.
Functionality
- Parse Portable PDB files with
PortablePdb::parse
. - Convert Portable PDB files to
PortablePdbCaches
withPortablePdbCacheConverter::process_portable_pdb
. - Serialize
PortablePdbCaches
withPortablePdbCacheConverter::serialize
and parse them withPortablePdbCache::parse
. - Look up line information for a function on a
PortablePdbCache
withPortablePdbCache::lookup
.
Example
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);
Structure of a Portable PDB file
An ECMA-335 file is divided into sections called streams. The possible streams are:
#~
("metadata"), comprising information about classes, methods, modules, &c., organized into tables adhering to various schemas. The original ECMA-335 tables are described in Section II.22 of the ECMA-335 spec, the tables added by Portable PDB are described in the Portable PDB spec. TheMethodDebugInformation
table is of particular interest tosymbolic
, as it contains line information for functions.#Strings
, comprising null-terminated UTF-8 strings.#GUID
, a list of GUIDs.#US
("user strings"), comprising UTF-16 encoded strings.#Blob
, comprising blobs of data that don't fit in any of the other streams.
The Portable PDB format extends ECMA-335 by the addition of another steam, #PDB
, as well
as several tables to the #~
stream.
Dependencies
~2.3–3.5MB
~66K SLoC