何时实际加载 pdb 文件

Posted

技术标签:

【中文标题】何时实际加载 pdb 文件【英文标题】:When are pdb files actually loaded 【发布时间】:2013-07-11 21:03:05 【问题描述】:

在 Visual Studio 中进行“调试”构建时,它会输出一个 pdb 文件,以便在发生异常时获得详细信息。

pdb文件中的信息是在运行可执行文件时实际加载的,还是稍后在异常发生时加载的?

【问题讨论】:

很多人也为发布版本构建 .pdb 文件。 【参考方案1】:

IDA 等反编译器在分析您的可执行文件时加载符号文件,或者当您告诉它使用可执行文件加载特定符号时,只要它与当前正在调试的可执行文件匹配。

Visual Studio 调试器等调试器会在开始调试时立即加载 PDB 文件和符号,而不是在发生异常时加载。

The MSDN page on PDB files 进一步强调了这一点:

Visual Studio 调试器使用由 链接器直接将 PDB 的绝对路径嵌入到 EXE 中或 DLL 文件。如果调试器在该位置找不到 PDB 文件,或者 如果路径无效(例如,如果项目被移动到 另一台计算机),调试器搜索包含 EXE 的路径, 在解决方案的属性页中指定的符号路径(常见 属性文件夹,调试符号文件页面)。调试器不会 加载与正在调试的二进制文件不匹配的 PDB。

当然,如果程序是在没有/debug的情况下编译的,PDB文件的路径将不会包含在生成的exe或DLL中。

【讨论】:

好的,谢谢,但它们是在异常发生时加载还是在应用程序启动时加载? 它们在你的应用程序被调试时被加载;当调试器开始调试时。如果您正在编译为 /release 并且发生异常,JIT 可能会对它们做一些事情,但我不能 100% 确定这一点。【参考方案2】:

是的,它们是在 VS 之外加载的。如果您的代码在加载 PDB 时崩溃,您将看到源代码位置和行号。

【讨论】:

好的,但它们是在崩溃时加载还是在应用程序启动时加载? @clamp:在应用程序启动时甚至没有加载可执行文件(!)。这是通过在页面错误发生时在代码中分页来完成的。因此,未使用的代码根本不会被分页。

以上是关于何时实际加载 pdb 文件的主要内容,如果未能解决你的问题,请参考以下文章

嵌入的 svg 何时实际加载,我如何检查它是不是已加载

未从同一目录加载 C++ PDB 符号

sqlldr加载19c pdb最佳实践

sqlldr加载19c pdb最佳实践

动态加载.dll文件后释放.dll和.pdb

此模块的调试信息中缺少源信息 - PDB 已成功加载