调试信息(断点等)存储在 VS2013、本机 C++ dll 项目中的位置在哪里?

Posted

技术标签:

【中文标题】调试信息(断点等)存储在 VS2013、本机 C++ dll 项目中的位置在哪里?【英文标题】:Where is location that Debug info (break point, etc) was stored in VS2013, native C++ dll project? 【发布时间】:2014-11-05 12:10:55 【问题描述】:

我想知道调试 c++ 本机 dll 项目时调试信息的存储位置。

我的解决方案中有 2 个项目,C# 托管项目和 C++ dll 项目。当我插入断点原生 dll 时,vs 在 C# 使用 dllimport 的原生调用中会很好地停止。而且,我直接将本机 dll 复制到托管项目(因此托管项目只有本机项目的本机 dll 文件,没有 pdbfile),vs 在本机调用中也停止断点!是什么让这成为可能?托管项目没有本机 dll 的 pdb 文件的信息,但似乎 vs 仍然可以访问本机 pdb 文件。谁能解释一下?

【问题讨论】:

如果我没记错的话,PDB的路径是存储在DLL中的,如果找不到,调试根本就不会开始。 使用 dumpbin.exe 实用程序查看 DLL。使用 /all 选项从 Visual Studio 命令提示符运行它。您可以轻松找到调试目录,它包含 PDB 文件的路径。调试器就是这样知道的。 【参考方案1】:

无论应用程序如何启动(通过或不通过 .net),调试非托管 dll 都是相同的。无论从何处加载 dll,Visual Studio 都会在同一目录中查找 .pdb 文件并加载该文件(如果存在)。

您可以在输出窗口 (Debug->Window->Output) 中看到这种情况发生的时间。你会看到这样一行:

'<your-exe>.exe': Loaded '<path-to-dll>\<your-dll>.dll', Symbols loaded.

如果您正在编写一个 .net 应用程序,如果在您的 .net 应用程序项目设置(属性->调试->启用调试器)中关闭“非托管代码调试”,这一切都不会发生

【讨论】:

【参考方案2】:

PDB 加载遵循许多规则。 Visual Studio 的第一次尝试是假设 DLL 是在调试机器上构建的。 dll 中有对 pdb 的完全限定引用。该规则正在触发。稍后,它使用 _NT_SYMBOL_PATH 变量,如果引用了符号服务器,则可以从同一个 dll 中找到 pdb 的多个版本。

【讨论】:

以上是关于调试信息(断点等)存储在 VS2013、本机 C++ dll 项目中的位置在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

vs2015调试断点无法命中

vs2013 无法进行断点调试,怎么解决

gccrelease模式设置断点

vs调试断点进不去的解决办法

关于VS2013调试IIS应用源代码时无法进入断点的问题总结

VS调试时偶发无法进入断点行号错乱等问题解决方法