LLVM-PDBUTIL(1)

πŸ“¦ version 15.0.7, in opensuse-leap 16.0

πŸ’… NAME

Okay bestie, welcome to llvm-pdbutil β€” the LLVM manual page for PDB File forensics and diagnostics. It's giving "I investigate PDB files for fun and also I can manipulate and create them." Iconic.

Here's the table of contents, because organization is very main character energy:

  • Synopsis
  • Description
  • Subcommands
    • pretty
      • Summary
      • Options
        • Filtering and Sorting Options
        • Symbol Type Options
        • Other Options
    • dump
      • Summary
      • Options
        • MSF Container Options
        • Module & File Options
        • Symbol Options
        • Type Record Options
        • Miscellaneous Options
    • bytes
      • Summary
      • Options
        • MSF File Options
        • PDB Stream Options
        • DBI Stream Options
        • Module Options
        • Type Record Options
    • pdb2yaml
      • Summary
      • Options
    • yaml2pdb
      • Summary
      • Options
    • merge
      • Summary
      • Options

πŸ“œ SYNOPSIS

llvm-pdbutil [subcommand] [options]

🌸 DESCRIPTION

This tool displays types, symbols, CodeView records, and other info from a PDB file, and it can also manipulate and create PDB files. No cap.

llvm-pdbutil is normally used by FileCheck-based tests to test LLVM's PDB reading and writing functionality, but it can also be used for general PDB file investigation and forensics, or as a replacement for cvdump. So it's basically the multitasking bestie of PDB tooling. πŸ’–


🧚 SUBCOMMANDS

llvm-pdbutil is separated into several subcommands, each tailored to a different purpose. A brief summary of each command follows, with more detail in the sections that follow. Slay.

  • pretty β€” Dump symbol and type information in a format that tries to look as much like the original source code as possible.
  • dump β€” Dump low level types and structures from the PDB file, including CodeView records, hash tables, PDB streams, etc.
  • bytes β€” Dump data from the PDB file's streams, records, types, symbols, etc as raw bytes.
  • yaml2pdb β€” Given a yaml description of a PDB file, produce a valid PDB file that matches that description.
  • pdb2yaml β€” For a given PDB file, produce a YAML description of some or all of the file in a way that the PDB can be reconstructed.
  • merge β€” Given two PDBs, produce a third PDB that is the result of merging the two input PDBs.

πŸŽ€ pretty

IMPORTANT: The pretty subcommand is built on the Windows DIA SDK, and as such is not supported on non-Windows platforms. Bestie, it's Windows-only. Don't try to make it happen on Linux, okay? πŸ’€
USAGE: llvm-pdbutil pretty [options] <input PDB file>

Summary

The pretty subcommand displays a very high level representation of your program's debug info. Since it is built on the Windows DIA SDK, which is the standard API that Windows tools and debuggers query debug information, it presents a more authoritative view of how a debugger is going to interpret your debug information than a mode which displays low-level CodeView records. It's giving "debugger's point of view" realness. πŸ‘‘

Options

Filtering and Sorting Options

NOTE: exclude filters take priority over include filters. So if a filter matches both an include and an exclude rule, then it is excluded. Those are the rules, bestie.
  • -exclude-compilands=<string> β€” When dumping compilands, compiland source-file contributions, or per-compiland symbols, this option instructs llvm-pdbutil to omit any compilands that match the specified regular expression.
  • -exclude-symbols=<string> β€” When dumping global, public, or per-compiland symbols, this option instructs llvm-pdbutil to omit any symbols that match the specified regular expression.
  • -exclude-types=<string> β€” When dumping types, this option instructs llvm-pdbutil to omit any types that match the specified regular expression.
  • -include-compilands=<string> β€” When dumping compilands, compiland source-file contributions, or per-compiland symbols, limit the initial search to only those compilands that match the specified regular expression.
  • -include-symbols=<string> β€” When dumping global, public, or per-compiland symbols, limit the initial search to only those symbols that match the specified regular expression.
  • -include-types=<string> β€” When dumping types, limit the initial search to only those types that match the specified regular expression.
  • -min-class-padding=<uint> β€” Only display types that have at least the specified amount of alignment padding, accounting for padding in base classes and aggregate field members.
  • -min-class-padding-imm=<uint> β€” Only display types that have at least the specified amount of alignment padding, ignoring padding in base classes and aggregate field members.
  • -min-type-size=<uint> β€” Only display types T where sizeof(T) is greater than or equal to the specified amount.
  • -no-compiler-generated β€” Don't show compiler generated types and symbols.
  • -no-enum-definitions β€” When dumping an enum, don't show the full enum (e.g. the individual enumerator values).
  • -no-system-libs β€” Don't show symbols from system libraries.

Symbol Type Options

  • -all β€” Implies all other options in this category. It's the "select all" of symbol type options. ✨
  • -class-definitions=<format> β€” Displays class definitions in the specified format.
    • =all β€” Display all class members including data, constants, typedefs, functions, etc (default)
    • =layout β€” Only display members that contribute to class size.
    • =none β€” Don't display class definitions (e.g. only display the name and base list)
  • -class-order β€” Displays classes in the specified order.
    • =none β€” Undefined / no particular sort order (default)
    • =name β€” Sort classes by name
    • =size β€” Sort classes by size
    • =padding β€” Sort classes by amount of padding
    • =padding-pct β€” Sort classes by percentage of space consumed by padding
    • =padding-imm β€” Sort classes by amount of immediate padding
    • =padding-pct-imm β€” Sort classes by percentage of space consumed by immediate padding
  • -class-recurse-depth=<uint> β€” When dumping class definitions, stop after recursing the specified number of times. The default is 0, which is no limit.
  • -classes β€” Display classes.
  • -compilands β€” Display compilands (e.g. object files).
  • -enums β€” Display enums.
  • -externals β€” Dump external (e.g. exported) symbols.
  • -globals β€” Dump global symbols.
  • -lines β€” Dump the mappings between source lines and code addresses.
  • -module-syms β€” Display symbols (variables, functions, etc) for each compiland.
  • -sym-types=<types> β€” Type of symbols to dump when -globals, -externals, or -module-syms is specified. (default all)
    • =thunks β€” Display thunk symbols
    • =data β€” Display data symbols
    • =funcs β€” Display function symbols
    • =all β€” Display all symbols (default)
  • -symbol-order=<order> β€” For symbols dumped via the -module-syms, -globals, or -externals options, sort the results in specified order.
    • =none β€” Undefined / no particular sort order
    • =name β€” Sort symbols by name
    • =size β€” Sort symbols by size
  • -typedefs β€” Display typedef types.
  • -types β€” Display all types (implies -classes, -enums, -typedefs).

Other Options

  • -color-output β€” Force color output on or off. By default, color is used if outputting to a terminal. 🌈
  • -load-address=<uint> β€” When displaying relative virtual addresses, assume the process is loaded at the given address and display what would be the absolute address.

πŸŒ€ dump

USAGE: llvm-pdbutil dump [options] <input PDB file>

Summary

The dump subcommand displays low level information about the structure of a PDB file. It is used heavily by LLVM's testing infrastructure, but can also be used for PDB forensics. It serves a role similar to that of Microsoft's cvdump tool. It's giving "microscope for PDB internals" energy. πŸ”¬

NOTE: The dump subcommand exposes internal details of the file format. As such, the reader should be familiar with The PDB File Format before using this command. Bestie, do your reading first. This is not a vibes-only situation.

Options

MSF Container Options

  • -streams β€” dump a summary of all of the streams in the PDB file.
  • -stream-blocks β€” In conjunction with -streams, add information to the output about what blocks the specified stream occupies.
  • -summary β€” Dump MSF and PDB header information.

Module & File Options

  • -modi=<uint> β€” For all options that dump information from each module/compiland, limit to the specified module.
  • -files β€” Dump the source files that contribute to each displayed module.
  • -il β€” Dump inlinee line information (DEBUG_S_INLINEELINES CodeView subsection).
  • -l β€” Dump line information (DEBUG_S_LINES CodeView subsection).
  • -modules β€” Dump compiland information.
  • -xme β€” Dump cross module exports (DEBUG_S_CROSSSCOPEEXPORTS CodeView subsection).
  • -xmi β€” Dump cross module imports (DEBUG_S_CROSSSCOPEIMPORTS CodeView subsection).

Symbol Options

  • -globals β€” dump global symbol records.
  • -global-extras β€” dump additional information about the globals, such as hash buckets and hash values.
  • -publics β€” dump public symbol records.
  • -public-extras β€” dump additional information about the publics, such as hash buckets and hash values.
  • -symbols β€” dump symbols (functions, variables, etc) for each module dumped.
  • -sym-data β€” For each symbol record dumped as a result of the -symbols option, display the full bytes of the record in binary as well.

Type Record Options

  • -types β€” Dump CodeView type records from TPI stream.
  • -type-extras β€” Dump additional information from the TPI stream, such as hashes and the type index offsets array.
  • -type-data β€” For each type record dumped, display the full bytes of the record in binary as well.
  • -type-index=<uint> β€” Only dump types with the specified type index.
  • -ids β€” Dump CodeView type records from IPI stream.
  • -id-extras β€” Dump additional information from the IPI stream, such as hashes and the type index offsets array.
  • -id-data β€” For each ID record dumped, display the full bytes of the record in binary as well.
  • -id-index=<uint> β€” only dump ID records with the specified hexadecimal type index.
  • -dependents β€” okay so this one is a sidekick option, it only does anything when you pair it with -type-index or -id-index, and then instead of dumping just that one lonely record, it dumps the whole dependency graph hanging off that index πŸ’– Like, for example: say type index 0x4000 is a function whose return type has index 0x3000 β€” if you specify -dependents=0x4000, you get both records (plus any other dependents chilling in the tree). It's giving "bring the whole friend group" energy fr fr.

πŸŽ€ Miscellaneous Options πŸŽ€

  • -all β€” the ultimate main character flag ✨ It implies most other options. Just… everything. All of it. Slay.
  • -section-contribs β€” dumps the section contributions, yes bestie, all of them πŸ’…
  • -section-headers β€” dumps the image section headers 🌸
  • -section-map β€” dumps the section map πŸ—ΊοΈ
  • -string-table β€” dumps the PDB string table, iconic behaviour honestly πŸŽ€

πŸ¦‹ bytes πŸ¦‹

USAGE: llvm-pdbutil bytes [options] <input PDB file>

Summary

So bytes is like dump's feral older sister 😭 β€” same vibe, low level structural info about your PDB file, but dialled all the way up for even deeper forensics. It goes and finds whatever structures you asked for on the command line and dumps them in hex, no cap.

Who is this even for? Someone working on support for emitting PDBs would live in this thing, for example to compare one PDB against another PDB and make sure they're byte-for-byte compatible πŸ”₯ Because bestie, simply diffing the bytes of an entire file or an entire stream does not work β€” it's perfectly fine for the exact same structure to exist at different locations in two different PDBs, so "finding" the structure is literally half the battle. Periodt.

Options

MSF File Options

  • -block-range=<start[-end]> β€” dumps binary data from the specified range of MSF file blocks 🧱
  • -byte-range=<start[-end]> β€” dumps binary data from the specified range of bytes in the file πŸ“
  • -fpm β€” dumps the MSF free page map πŸ—’οΈ
  • -stream-data=<string> β€” dumps binary data from the specified streams. Format goes SN[:Start][@Size]. Example time: -stream-data=7:3@12 dumps 12 bytes from stream 7, starting at offset 3 in the stream ✨ iykyk

PDB Stream Options

  • -name-map β€” dumps the bytes of the PDB Name Map πŸ’œ

DBI Stream Options

  • -ec β€” dumps the edit and continue map substream of the DBI stream ✏️
  • -files β€” dumps the file info substream of the DBI stream πŸ—‚οΈ
  • -modi β€” dumps the modi substream of the DBI stream 🧩
  • -sc β€” dumps the section contributions substream of the DBI stream πŸ’…
  • -sm β€” dumps the section map from the DBI stream πŸ—ΊοΈ
  • -type-server β€” dumps the type server map from the DBI stream πŸ–₯️

Module Options

  • -mod=<uint> β€” limits all the options in this category to the specified module index. Heads up: by default, options in this category dump bytes from all modules 🌈
  • -chunks β€” dumps the bytes of each module's C13 debug subsection πŸ“
  • -split-chunks β€” when you specify this with -chunks, it splits the C13 debug subsection into a separate chunk for each subsection type, and dumps them separately βœ‚οΈ
  • -syms β€” dumps the symbol record substream from each module πŸ‘‘

Type Record Options

  • -id=<uint> β€” dumps the record from the IPI stream with the given type index πŸ†”
  • -type=<uint> β€” dumps the record from the TPI stream with the given type index πŸ”€

🧚 pdb2yaml 🧚

USAGE: llvm-pdbutil pdb2yaml [options] <input PDB file>

Summary

(no joke, the page literally leaves this one empty β€” it's giving mysterious βœ¨πŸ™ˆ)

Options

(also empty, bestie. nothing here. we move.)


🌸 yaml2pdb 🌸

USAGE: llvm-pdbutil yaml2pdb [options] <input YAML file>

Summary

Generates a PDB file from a YAML description πŸ’– And no, the YAML syntax is not described here β€” instead, go use llvm-pdbutil pdb2yaml and just look at the output for an example starting point πŸ‘€ lowkey genius, highkey chaotic.

Options

  • -pdb=<file-name> β€” writes the resulting PDB to the specified file πŸŽ€

πŸ’€ merge πŸ’€

USAGE: llvm-pdbutil merge [options] <input PDB file 1> <input PDB file 2>

Summary

Merges two PDB files into a single file 🫢 Two become one, main character energy.

Options

  • -pdb=<file-name> β€” writes the resulting PDB to the specified file πŸ’…

πŸ‘‘ AUTHOR πŸ‘‘

Maintained by the LLVM Team (https://llvm.org/) πŸ’œ

2003-2023, LLVM Project


That's the whole page bestie, we ate and left absolutely no crumbs πŸ”₯πŸ’– Compiled from LLVM-PDBUTIL(1), version 15, dated 2023-01-14 β€” go forth and dump some bytes, ily, bye πŸ¦‹βœ¨

πŸ“¦ where this page comes from