未加载符号文件以在Visual Studio 2012中调试自定义项目

时间:2013-08-07 17:11:19

标签: c# .net visual-studio visual-studio-2012 msbuild

我在Visual Studio 2012中有一个大型解决方案,它包含可执行文件和类库项目。 在调试应用程序时,一个特定类库项目中的断点未被命中。

我查看了调试> Windows和GT;模块窗口,用于检查该项目符号的状态,并显示“无法找到或打开PDB文件”
它还在“用户代码”列下显示“否” 我注意到解决方案中还有一些自定义项目在该列中显示“否”,并且它们的符号也无法加载。 “用户代码”下面带有“是”的任何内容似乎已经将pdb加载没有问题。但我不确定这是否相关。

我在dll上使用了 dumpbin / headers ,并且pdb文件的路径存在且正确。

模块绝对不在符号加载的排除列表中。

我还尝试右键单击模块窗口中的条目,选择“加载符号”并导航到dll标题中给出的路径。当我选择pdb时,它说“在此文件夹中找不到匹配的符号文件”

在删除这些文件夹和文件,清理解决方案,关闭它并重建整个文件后,我得到了这个。 pdb肯定与有问题的dll同时构建。

显然问题是错误消息的“无法打开pdb”部分。

我在两台计算机上试过这个,两者都表现出相同的行为。

任何人都可以提供任何关于从何处开始的建议,也许为什么在地球上对应于dll的内置pdb不会加载?

17 个答案:

答案 0 :(得分:38)

我尝试了一些工具来检查pdb和dll是否实际匹配,并使用chkmatch我可以看到正在运行的dll中的GUID与obj文件夹中的pdb不匹配。< / p>

事实证明,虽然项目的obj文件夹中的dll和pdb是匹配的,但是实际上通过构建后事件复制到应用程序的目标文件夹的dll是来自上一版本的旧dll。

构建后事件在该特定项目构建之前运行,或者至少已完成构建,并且正在从bin中复制现有dll,随后被继续构建覆盖。

我通过编辑解决方案的项目依赖项并确保具有post-build事件的项目依赖于未加载的项目来解决问题,现在pdb在调试期间加载。

答案 1 :(得分:31)

我只是从启动项目文件夹中删除了bin和obj文件夹并重建了解决方案。

答案 2 :(得分:10)

对我来说,我刚刚从IIS中删除了该项目并再次创建它并且工作正常

答案 3 :(得分:9)

对我而言,它有助于使用chkmatch工具,然后关闭并打开visual studio,进行清理和重建。现在我的pdb也被加载了。正如Nanhydrin指出的那样,你可以确保它来自Debug - &gt; Windows - &gt;模块 - 此视图仅在调试期间可访问。

答案 4 :(得分:6)

我发现我收到消息的项目在构建时正在优化。

我进入了项目属性,编译选项卡,高级编译选项...并取消选中Enable Optimizations复选框

Deselect Enable Optimizations

答案 5 :(得分:3)

提醒:将项目置于“调试”配置中......对于像我这样忘记并感到愚蠢的人。

答案 6 :(得分:2)

这里的派对迟到了 - 以防这是有帮助的。

我们有几个独立的网站(在Visual Studio的不同解决方案中)。在其中一个站点的初始加载时,我们正在调用另一个将返回图像的站点。

这两个网站都引用了一个常见的DLL,但是在一个网站上工作时,却没有意识到其他网站已经被放置在“发布”中。构建 - 加载网站后,重建了违规的DLL,但没有符号。

感谢Nanhydrin提到模块调试窗口(非常有帮助),以及使用post build事件让我走上正确的轨道。

答案 7 :(得分:2)

从解决方案中删除了项目,并将其再次添加到为我工作的解决方案中。 :)

答案 8 :(得分:1)

从另一个对我有用的帖子中回答:https://stackoverflow.com/a/28476665/5969306
- 在Visual Studio中:项目属性 - &gt;构建 - &gt;高级按钮 - &gt;调试信息下拉列表并确保该值不是“无”。

答案 9 :(得分:1)

我刚刚遇到这个问题并且认为我会在这里解决问题,因为我将来帮助其他人(甚至可能是我自己?)...

确保在附加到远程服务器上的进程时,“附加到”设置为

  

自动确定要调试的代码类型

要执行此操作,当提供服务器限定符并且可以看到进程列表时,请单击“附加到”输入旁边的“选择”按钮。

Image 1 然后,选择“自动确定要调试的代码类型”并在屏幕外单击“确定”,然后附加。

Image 2
这至少为我解决了这个问题。

答案 10 :(得分:1)

在我的情况下,Enable Just My Code的{​​{1}}上有一个复选标记。

我没有选中它,并且它起作用了。

Example Image

答案 11 :(得分:0)

我的调试窗口中有这样一行:

  

模块符号&#39; MyModule.dll&#39;没装。

我删除了“优化代码”&#39;项目属性中的选项 - &gt;建立。错误消失了。

答案 12 :(得分:0)

此问题可能是由于项目中使用的错误引用dll

再次删除当前项目中的 obj bin 文件夹以及构建项目。

答案 13 :(得分:0)

检查ASP.NET临时文件夹的权限:

objdump -D test | grep print_vec_long  -A 10
0000000000000924 <print_vec_long>:
 924:   02 00 4c 3c     addis   r2,r12,2
 928:   dc 75 42 38     addi    r2,r2,30172
 92c:   a6 02 08 7c     mflr    r0
 930:   10 00 01 f8     std     r0,16(r1)
 934:   f8 ff e1 fb     std     r31,-8(r1)
 938:   61 ff 21 f8     stdu    r1,-160(r1)
 93c:   78 0b 3f 7c     mr      r31,r1
 940:   78 00 7f f8     std     r3,120(r31)
 944:   56 12 02 f0     xxswapd vs0,vs34
 948:   d0 ff 20 39     li      r9,-48

应用程序池的用户必须拥有使用ASP.NET文件的子文件夹的权限,例如:

"c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files"

答案 14 :(得分:0)

  1. 从以下答案中检查选项:https://stackoverflow.com/a/38377530/6911991
  2. 点击高级,并检查调试信息是否设置为“完整”
    Advanced tab screenshot
  3. 在解决方案中的所有项目中检查运行配置

答案 15 :(得分:0)

我遇到了这个问题,尝试了所有其他解决方案(花了2天!我在哭……!两天了!)但最后我意识到我的文件已在GAC中注册,我删除了它,然后问题就解决了。解决了。​​

在命令提示符处,键入以下命令:

forkOS

How to: Remove an Assembly from the Global Assembly Cache

答案 16 :(得分:0)

请检查您的dll的依赖性,如果您将其添加到解决方案中,则可能导致加载符号失败。