据说调试符号不会为文档加载,即使它们是为 dll 加载的

Posted

技术标签:

【中文标题】据说调试符号不会为文档加载,即使它们是为 dll 加载的【英文标题】:Debug symbols are said to be not loaded for a document even though they are loaded for the dll 【发布时间】:2011-06-22 17:32:02 【问题描述】:

我已经用调试信息(编译器选项 /Zi 和链接器选项 /DEBUG)构建了一个特定的 dll。通过主程序中的中断语句,我启动了 Visual Studio 进行调试。在 Debug->Windows 菜单中显示的模块列表中,我可以看到已为感兴趣的 dll 加载了符号。但是,当我从该 dll 打开 C++ 文件并尝试设置断点时,它显示调试符号不适用于文档。毫无疑问,这个 C++ 文件被编译到那个 dll 中,并且它与用于构建 dll 的源相同(我只是这样做了)。为什么会这样?在我开枪之前请帮忙。

【问题讨论】:

尝试删除解决方案目录中隐藏的.suo文件。 C++ 源代码在驱动器上的位置是否与构建 DLL 时的位置相同?或者您正在运行带有源索引的符号服务器? 我现在也发生了同样的事情。出乎意料的是,我在不同的运行中遇到了不同的断点。 (这是一个直接的 VC++ MFC 解决方案。所有第三方库都以源代码形式存在,并与解决方案的其余部分一起编译。) 好的,我进行了 Windows 更新,重新启动,启动了行为不端的 VS2008,进行了清理,进行了重建,我看到在重建中编译的代码中出现了急需的断点未加载符号。这对我来说是一个真实而严重的问题,所以现在是赏金时间。 您确定 pdb 和 dll 匹配吗?另见***.com/questions/134866/… 【参考方案1】:

我没有明确的答案,只有一些建议。

有时 mdm.exe(机器调试管理器)会停止正常工作。终止进程并重新启动 Visual Studio 会有所帮助。如果问题在重新启动之间仍然存在,但这可能不是原因。

未来的源文件时间(上次修改)可能会导致各种奇怪的问题。要检查文件时间,您可以无搜索 (Windows XP) 或“*” (Windows 7)。这将列出所选文件夹中的所有文件。然后按日期对结果进行排序以查看最大/最小文件时间。我不知道不正确的文件时间来自哪里 - 我只知道它不时发生。可能是 Visual Studio 本身,也可能是我正在使用的其他工具。

您可以尝试从 Visual Studio 启动使用您的 DLL 的应用程序,并且您的 DLL 项目已经打开。为此,请打开“配置属性”,选择“调试”页面,然后输入应该启动的 .exe(如果需要,请加上参数)。然后像对 .exe 项目一样启动调试会话。

解决 Visual Studio 的许多问题的方法是手动“清理”项目,然后重新编译。删除在构建过程中生成或存储解决方案或项目“选项”的所有文件。即所有 .suo .ncb .user 文件以及“中间”和“输出”文件夹中的所有内容。如果您正在使用源代码控制,只需将整个项目从源代码控制系统检索到一个干净的目录中,然后从头开始重新构建。 (从源代码控制中获取“新鲜”的所有内容也可以解决任何潜在的文件时间问题 - 至少对于不保留文件时间的源代码控制系统而言)

另一个可能的原因是 VS 加载了错误的 .pdb 文件。可以在为 VS 配置的符号服务器/符号目录(或通过 _NT_SYMBOL_PATH 变量在系统范围内)或 VS 符号缓存目录中找到具有匹配名称的 .pdb 文件。具有匹配名称的 .pdb 文件如何出现在这样的地方是另一回事,但可以轻松检查是否加载了错误的 .pdb 文件:删除构建生成的 .pdb 文件,然后启动调试会话.如果 VS 跟踪有问题的 .exe/.dll 的“已加载符号”,则它一定在其他位置找到了 .pdb 文件。

有时 VS 似乎会以某种方式弄乱断点位置。我不完全知道这种情况何时或如何发生,但其中一个症状是,如果删除一些断点,它们会在启动下一个调试会话时神奇地重新出现。我发现设置一个新断点,然后通过 Debug/Delete All Breakpoints 删除所有断点,重新设置所需的断点会有所帮助。

【讨论】:

从源代码控制和构建中获得新鲜感帮助我前进。它揭示了一个文件对已编译 dll 的“Release MinSize”版本具有硬编码依赖性。一旦我(暂时)将其更改为调试并重建,我就可以进入 C++。谢谢【参考方案2】:

1) 你根本无法达到断点吗?通常,一旦需要命中模块或堆栈框架中的代码,它就会得到解决。 2) 检查您的 pdb 是否没有剥离源信息

【讨论】:

就我个人而言,1) 有时我可以击中它,有时我不能,并且 2) 项目属性中没有任何剥离的迹象。 您可以使用调试器窗口的模块视图检查 pdb 信息。【参考方案3】:

执行构建->清理解决方案,关闭 Visual Studio,然后重新启动它并重新构建。我以前也遇到过这种情况,现在似乎解决了这个问题,我想只是一些过时的 pdb 信息。

【讨论】:

【参考方案4】:

就我而言,我已经重命名了 C++ 项目。编译器正在输出newName.lib,而我的其他项目仍在引用oldName.lib,这当然不会被Build->Clean 删除。

我通过遵循手动清理构建目录的建议发现了这一点。随后的链接器unresolved external reference 泄露了情况。

【讨论】:

以上是关于据说调试符号不会为文档加载,即使它们是为 dll 加载的的主要内容,如果未能解决你的问题,请参考以下文章

VB.net调用VC.net写的DLL出现“当前不会命中断点,还没有为该文档加载任何符号”!!急!急急!!!

Visual Studio 2008 未加载 MFC dll 符号

当前不会命中断点还未为文档加载任何符号——问题探究

当前不会命中断点还未为文档加载任何符号——问题探究

我经常在vs2010里调试C#网站程序,但 总报”当前不会命中断点,还没有为该文档加载任何符号。“不知道为什

当前不会命中断点:此文档未加载任何符号