llvm-pdbutil - PDB 文件取证和诊断

概要

llvm-pdbutil [子命令] [选项]

描述

显示来自 PDB 文件的类型、符号、CodeView 记录和其他信息,以及操作和创建 PDB 文件。llvm-pdbutil 通常被基于 FileCheck 的测试用于测试 LLVM 的 PDB 读取和写入功能,但也可用作通用的 PDB 文件调查和取证工具,或者作为 cvdump 的替代品。

子命令

llvm-pdbutil 分为几个子命令,每个子命令都针对不同的目的。以下是每个命令的简要概述,更详细的信息请参见后续章节。

  • pretty - 以尽可能类似于原始源代码的格式转储符号和类型信息。

  • dump - 从 PDB 文件转储低级类型和结构,包括 CodeView 记录、哈希表、PDB 流等。

  • bytes - 以原始字节形式转储来自 PDB 文件的流、记录、类型、符号等的数据。

  • yaml2pdb - 给定 PDB 文件的 yaml 描述,生成与该描述匹配的有效 PDB 文件。

  • pdb2yaml - 对于给定的 PDB 文件,生成文件部分或全部的 YAML 描述,以便可以重建 PDB。

  • merge - 给定两个 PDB,生成第三个 PDB,它是合并两个输入 PDB 的结果。

pretty

重要

pretty 子命令构建于 Windows DIA SDK 之上,因此在非 Windows 平台上不受支持。

用法:llvm-pdbutil pretty [选项] <输入 PDB 文件>

摘要

pretty 子命令显示程序调试信息的非常高级别的表示形式。由于它构建于 Windows DIA SDK 之上,而 Windows DIA SDK 是 Windows 工具和调试器查询调试信息的标准 API,因此与显示低级 CodeView 记录的模式相比,它提供了调试器将如何解释调试信息的更权威的视图。

选项

过滤和排序选项

注意

排除 过滤器优先于包含 过滤器。因此,如果过滤器同时匹配包含规则和排除规则,则会被排除。

-exclude-compilands=<string>

当转储编译单元、编译单元源文件贡献或每个编译单元符号时,此选项指示 llvm-pdbutil 忽略任何与指定正则表达式匹配的编译单元。

-exclude-symbols=<string>

当转储全局符号、公共符号或每个编译单元符号时,此选项指示 llvm-pdbutil 忽略任何与指定正则表达式匹配的符号。

-exclude-types=<string>

当转储类型时,此选项指示 llvm-pdbutil 忽略任何与指定正则表达式匹配的类型。

-include-compilands=<string>

当转储编译单元、编译单元源文件贡献或每个编译单元符号时,将初始搜索限制为仅与指定正则表达式匹配的编译单元。

-include-symbols=<string>

当转储全局符号、公共符号或每个编译单元符号时,将初始搜索限制为仅与指定正则表达式匹配的符号。

-include-types=<string>

当转储类型时,将初始搜索限制为仅与指定正则表达式匹配的类型。

-min-class-padding=<uint>

仅显示具有至少指定对齐填充量的类型,包括基类和聚合字段成员中的填充。

-min-class-padding-imm=<uint>

仅显示具有至少指定对齐填充量的类型,忽略基类和聚合字段成员中的填充。

-min-type-size=<uint>

仅显示类型 T,其中 sizeof(T) 大于或等于指定的量。

-no-compiler-generated

不显示编译器生成的类型和符号

-no-enum-definitions

当转储枚举时,不显示完整的枚举(例如,各个枚举器值)。

-no-system-libs

不显示来自系统库的符号

符号类型选项
-all

暗示此类别中的所有其他选项。

-class-definitions=<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

以指定顺序显示类。

=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>

当转储类定义时,在递归指定次数后停止。 默认值为 0,表示没有限制。

-classes

显示类

-compilands

显示编译单元(例如,目标文件)

-enums

显示枚举

-externals

转储外部(例如,导出的)符号

-globals

转储全局符号

-lines

转储源代码行和代码地址之间的映射。

-module-syms

显示每个编译单元的符号(变量、函数等)

-sym-types=<types>

当指定 -globals、-externals 或 -module-syms 时要转储的符号类型。(默认为 all)

=thunks - Display thunk symbols
=data   - Display data symbols
=funcs  - Display function symbols
=all    - Display all symbols (default)
-symbol-order=<order>

对于通过 -module-syms、-globals 或 -externals 选项转储的符号,按指定顺序对结果进行排序。

=none - Undefined / no particular sort order
=name - Sort symbols by name
=size - Sort symbols by size
-typedefs

显示 typedef 类型

-types

显示所有类型(暗示 -classes、-enums、-typedefs)

其他选项
-color-output

强制启用或禁用彩色输出。 默认情况下,如果输出到终端,则使用颜色。

-load-address=<uint>

当显示相对虚拟地址时,假设进程加载在给定的地址,并显示将是绝对地址的值。

dump

用法:llvm-pdbutil dump [选项] <输入 PDB 文件>

摘要

dump 子命令显示有关 PDB 文件结构的低级信息。 它被 LLVM 的测试基础设施大量使用,但也可用于 PDB 取证。 它的作用类似于 Microsoft 的 cvdump 工具。

注意

dump 子命令公开了文件格式的内部细节。 因此,读者在使用此命令之前应熟悉 PDB 文件格式

选项

MSF 容器选项
-streams

转储 PDB 文件中所有流的摘要。

-stream-blocks

-streams 结合使用,向输出添加有关指定流占用的块的信息。

-summary

转储 MSF 和 PDB 标头信息。

模块和文件选项
-modi=<uint>

对于所有从每个模块/编译单元转储信息的选项,限制为指定的模块。

-files

转储为每个显示的模块贡献的源文件。

-il

转储内联行信息(DEBUG_S_INLINEELINES CodeView 子节)

-l

转储行信息(DEBUG_S_LINES CodeView 子节)

-modules

转储编译单元信息

-xme

转储跨模块导出(DEBUG_S_CROSSSCOPEEXPORTS CodeView 子节)

-xmi

转储跨模块导入(DEBUG_S_CROSSSCOPEIMPORTS CodeView 子节)

符号选项
-globals

转储全局符号记录

-global-extras

转储有关全局变量的附加信息,例如哈希桶和哈希值。

-publics

转储公共符号记录

-public-extras

转储有关公共变量的附加信息,例如哈希桶和哈希值。

-symbols

转储为每个转储的模块的符号(函数、变量等)。

-sym-data

对于作为 -symbols 选项结果转储的每个符号记录,也以二进制形式显示记录的完整字节。

类型记录选项
-types

从 TPI 流转储 CodeView 类型记录

-type-extras

从 TPI 流转储附加信息,例如哈希和类型索引偏移数组。

-type-data

对于转储的每个类型记录,也以二进制形式显示记录的完整字节。

-type-index=<uint>

仅转储具有指定类型索引的类型。

-ids

从 IPI 流转储 CodeView 类型记录。

-id-extras

从 IPI 流转储附加信息,例如哈希和类型索引偏移数组。

-id-data

对于转储的每个 ID 记录,也以二进制形式显示记录的完整字节。

-id-index=<uint>

仅转储具有指定十六进制类型索引的 ID 记录。

-dependents

-type-index-id-index 结合使用时,转储指定索引的整个依赖关系图,而不仅仅是具有指定索引的单个记录。 例如,如果类型索引 0x4000 是一个函数,其返回类型的索引为 0x3000,并且您指定 -dependents=0x4000,则这将转储两个记录(以及树中的任何其他依赖项)。

杂项选项
-all

暗示大多数其他选项。

-section-contribs

转储节贡献。

-section-headers

转储映像节头。

-section-map

转储节映射。

-string-table

转储 PDB 字符串表。

bytes

用法:llvm-pdbutil bytes [选项] <输入 PDB 文件>

摘要

dump 子命令类似,bytes 子命令显示有关 PDB 文件结构的低级信息,但它用于更深层次的取证。 bytes 子命令根据指定的命令行选项在 PDB 文件中查找各种结构,并以十六进制形式转储它们。 从事支持发出 PDB 的人员会大量使用它,例如,将一个 PDB 与另一个 PDB 进行比较,以确保字节对字节的兼容性。 简单地比较整个文件或整个流的字节是不够的,因为相同的结构完全可以存在于两个不同 PDB 中的不同位置,“找到”结构只是成功的一半。

选项

MSF 文件选项
-block-range=<start[-end]>

从指定的 MSF 文件块范围转储二进制数据。

-byte-range=<start[-end]>

从文件中指定的字节范围转储二进制数据。

-fpm

转储 MSF 空闲页面映射。

-stream-data=<string>

从指定的流转储二进制数据。 格式为 SN[:Start][@Size]。 例如,-stream-data=7:3@12 从流 7 转储 12 个字节,从流中的偏移量 3 开始。

PDB 流选项
-name-map

转储 PDB 名称映射的字节

DBI 流选项
-ec

转储 DBI 流的编辑和继续映射子流。

-files

转储 DBI 流的文件信息子流。

-modi

转储 DBI 流的 modi 子流。

-sc

转储 DBI 流的节贡献子流。

-sm

从 DBI 流转储节映射。

-type-server

从 DBI 流转储类型服务器映射。

模块选项
-mod=<uint>

将此类别中的所有选项限制为指定的模块索引。 默认情况下,此类别中的选项将转储来自所有模块的字节。

-chunks

转储每个模块的 C13 调试子节的字节。

-split-chunks

-chunks 一起指定时,将 C13 调试子节拆分为每个子节类型的单独块,并分别转储它们。

-syms

从每个模块转储符号记录子流。

类型记录选项
-id=<uint>

从 IPI 流转储具有给定类型索引的记录。

-type=<uint>

从 TPI 流转储具有给定类型索引的记录。

pdb2yaml

用法:llvm-pdbutil pdb2yaml [选项] <输入 PDB 文件>

摘要

选项

yaml2pdb

用法:llvm-pdbutil yaml2pdb [选项] <输入 YAML 文件>

摘要

从 YAML 描述生成 PDB 文件。 此处未描述 YAML 语法。 相反,请使用 llvm-pdbutil pdb2yaml 并检查输出来获取示例起点。

选项

-pdb=<file-name>

将生成的 PDB 写入到指定的文件。

merge

用法:llvm-pdbutil merge [选项] <输入 PDB 文件 1> <输入 PDB 文件 2>

摘要

将两个 PDB 文件合并为一个文件。

选项

-pdb=<文件名>

将生成的 PDB 写入到指定的文件。