未加载符号文件以在 Visual Studio 2012 中调试自定义项目
Posted
技术标签:
【中文标题】未加载符号文件以在 Visual Studio 2012 中调试自定义项目【英文标题】:Symbol file not loading for debugging custom project in Visual Studio 2012 【发布时间】:2013-08-09 04:40:40 【问题描述】:我在 Visual Studio 2012 中有一个大型解决方案,其中包含可执行文件和类库项目。 调试应用程序时,不会命中某个特定类库项目中的断点。
我查看了 Debug> Windows> Modules 窗口以检查该项目的符号状态,它显示“无法找到或打开 PDB 文件”。 它还在 “用户代码” 列下显示 “否”。 我注意到解决方案中的其他一些自定义项目在该列中显示“否”,并且它们的符号也无法加载。 “用户代码”下带有“是”的任何内容似乎都已加载它的 pdb 没有问题。但我不确定这是否相关。
我在 dll 上使用了 dumpbin /headers,并且 pdb 文件的路径存在且正确。
该模块绝对不在符号加载的排除列表中。
我还尝试右键单击模块窗口中的条目,选择 “加载符号” 并导航到 dll 标头中给出的路径。当我选择 pdb 时,它显示 “在此文件夹中找不到匹配的符号文件”。
在我删除这些文件夹和文件、清理解决方案、关闭它并重建整个东西后,我得到了这个。 pdb 肯定是与所讨论的 dll 同时构建的。
很明显,问题在于错误消息的“无法打开 pdb”部分。
我已经在 2 台计算机上尝试过这个,并且都表现出相同的行为。
任何人都可以提供关于从这里去哪里的任何建议,也许到底为什么与 dll 对应的构建的 pdb 不会为它加载?
【问题讨论】:
【参考方案1】:我尝试了一些工具来检查 pdb 和 dll 是否真正匹配,使用 chkmatch 我可以看到正在运行的 dll 中的 GUID 和 obj 文件夹中的 pdb 不匹配。
事实证明,尽管项目 obj 文件夹中的 dll 和 pdb 是匹配的,但实际上通过构建后事件复制到应用程序目标文件夹的 dll 是先前构建中的旧 dll。
构建后事件在该特定项目构建或至少完成构建之前运行,并且正在从 bin 中复制现有 dll,随后被继续构建覆盖。
我已通过编辑解决方案的项目依赖项并确保具有构建后事件的项目依赖于未加载的项目,现在 pdb 在调试期间加载,从而解决了该问题。
【讨论】:
我有同样的问题,通过阅读你的解决方案,我仍然不明白你做了什么来解决它。能不能详细解释一下? 基本上我的项目构建顺序错误。当您在 Visual Studio 2012 中右键单击您的解决方案时,会有一个项目依赖项选项,在打开的窗口中有一个构建顺序选项卡,您可以在其中设置项目的构建顺序。 我尝试从另一个文件夹添加 pdb 文件,下载符号(它开始下载 MS 符号,所以停止了它),指定要加载的模块 - 没有工作。我的问题是我从 Nuget 获取 dll,从我拥有的源获取 pdb。我从我拥有的源中复制了 dll 并且它有效!【参考方案2】:我只是从启动项目文件夹中删除了 bin 和 obj 文件夹并重建解决方案。
【讨论】:
为我工作!谢谢!【参考方案3】:对我来说,我刚刚从 IIS 中删除了项目并再次创建它,它工作正常
【讨论】:
清理解决方案对我不起作用,但重置本地 IIS 可以解决问题。显然一些程序集仍然被缓存。【参考方案4】:对我来说,它有助于使用 chkmatch 工具,然后关闭并打开 Visual Studio,清理并重建。现在我的 pdb 也被加载了。正如 Nanhydron 指出的那样,您可以确保它确实如此,从 Debug -> Windows -> Modules - 此视图只能在调试期间访问。
【讨论】:
【参考方案5】:我发现我收到消息的项目在构建时正在优化。
我进入项目属性、编译选项卡、高级编译选项...并取消选中 Enable Optimizations
复选框
【讨论】:
我刚刚在 csproj 属性中取消勾选“优化代码”。【参考方案6】:在我的情况下,旧版本的引用 dll 在我的 GAC 中。清除它,它工作。
【讨论】:
【参考方案7】:在我的情况下,Tools>>Options>>Debugging>>General
中的 Enable Just My Code
上有一个复选标记。
我取消选中它并且它起作用了。
Example Image
【讨论】:
在我的情况下,相反的工作 - 我有“符号文件未加载”错误并检查“启用我的代码”解决了这个问题。【参考方案8】:提醒:将项目放入“Debug”配置中……对于像我这样忘记并感到愚蠢的人。
【讨论】:
【参考方案9】:我刚遇到这个问题,我想我会把我的修复放在这里,因为它可以帮助其他人(甚至是我自己?!)在未来......
确保当您附加到远程服务器上的进程时,“附加到”设置为
自动确定要调试的代码类型
为此,当提供了服务器限定符并且进程列表可见时,单击“附加到”输入旁边的“选择”按钮。
然后,选择“自动确定要调试的代码类型”并确定出屏幕,然后附加。
这至少为我解决了这个问题。
【讨论】:
【参考方案10】:从解决方案中删除该项目并将其再次添加到对我有用的解决方案中。 :)
【讨论】:
【参考方案11】:在这里聚会有点晚了 - 以防万一这有帮助。
我们有几个单独的网站(在 Visual Studio 中的不同解决方案中)。在其中一个站点的初始加载时,我们正在调用另一个站点,该站点将返回一个图像。
这两个站点都引用了一个通用 DLL,但在一个站点上工作时,并没有意识到另一个站点已留在“发布”版本中 - 加载站点后,有问题的 DLL 被重建,但没有符号.
感谢 Nanhydrin 提到了模块调试窗口(非常有帮助),并让我在构建后事件中走上了正确的轨道。
【讨论】:
【参考方案12】:从另一个对我有用的线程回答:https://***.com/a/28476665/5969306 - 在 Visual Studio 中:项目属性 -> 构建 -> 高级按钮 -> 调试信息下拉菜单并确保该值不是“无”。
【讨论】:
【参考方案13】:我的调试窗口中有这样一行:
未加载模块“MyModule.dll”的符号。
我删除了项目属性 -> 构建中的“优化代码”选项。然后错误消失了。
【讨论】:
【参考方案14】:这个问题可能是由于项目中使用了dll引用错误。
删除当前项目中的obj和bin文件夹,再次build项目。
【讨论】:
【参考方案15】:检查 ASP.NET 临时文件夹的权限:
"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files"
应用程序池的用户必须有权访问包含 ASP.NET 文件的子文件夹,例如:
root\60039743\c28e12ee
【讨论】:
【参考方案16】:-
从此答案中检查选项:https://***.com/a/38377530/6911991
点击Advanced并检查Debugging Information是否设置为FULL
在解决方案的所有项目中检查运行配置
【讨论】:
【参考方案17】:我遇到了这个问题,尝试了所有其他解决方案(花了 2 天!!我哭了......!两天!)但最后我意识到我的文件已在 GAC 中注册,我将其删除,问题出在已解决。
在命令提示符下,键入以下命令:
gacutil –u <assembly name>
How to: Remove an Assembly from the Global Assembly Cache
【讨论】:
【参考方案18】:请检查您的dll的依赖关系,如果您添加到解决方案中,这可能会导致加载符号失败。
【讨论】:
【参考方案19】:我通过在 Debug->Options 菜单中禁用“使用托管兼容模式”解决了这个问题:
【讨论】:
以上是关于未加载符号文件以在 Visual Studio 2012 中调试自定义项目的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2008 未加载 MFC dll 符号