llvm-pdbutil - PDB 文件取证和诊断¶
概要¶
llvm-pdbutil [子命令] [选项]
描述¶
显示来自 PDB 文件的类型、符号、CodeView 记录和其他信息,以及操作和创建 PDB 文件。llvm-pdbutil 通常被基于 FileCheck 的测试用于测试 LLVM 的 PDB 读取和写入功能,但也可用作通用的 PDB 文件调查和取证工具,或者作为 cvdump 的替代品。
子命令¶
llvm-pdbutil 分为几个子命令,每个子命令都针对不同的目的。以下是每个命令的简要概述,更详细的信息请参见后续章节。
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 文件中所有流的摘要。
- -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¶
转储为每个转储的模块的符号(函数、变量等)。
类型记录选项¶
- -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 调试子节的字节。
- -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 写入到指定的文件。