35 stable releases (3 major)

12.8.0 Dec 1, 2023
12.7.1 Nov 29, 2023
12.5.0 Oct 24, 2023
12.3.0 Jul 19, 2023
9.2.1 Sep 30, 2022

#854 in Parser implementations

Download history 677/week @ 2023-12-14 444/week @ 2023-12-21 374/week @ 2023-12-28 1003/week @ 2024-01-04 1276/week @ 2024-01-11 2268/week @ 2024-01-18 1997/week @ 2024-01-25 5056/week @ 2024-02-01 6956/week @ 2024-02-08 3785/week @ 2024-02-15 5276/week @ 2024-02-22 4884/week @ 2024-02-29 2863/week @ 2024-03-07 3275/week @ 2024-03-14 3356/week @ 2024-03-21 2636/week @ 2024-03-28

12,886 downloads per month
Used in 3 crates (2 directly)

MIT license

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

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. The MethodDebugInformation table is of particular interest to symbolic, 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.2–3.5MB
~63K SLoC