没有加载任何符号,且缺少pdb文件。

3
我试图理解为什么会出现 "The breakpoint will not currently be hit. No symbols have been loaded for this document" 的提示,当我尝试调试我的网站应用程序时(注意:不是Web应用程序,如果这很重要)。
到目前为止,我发现pdb(项目调试数据库)文件与源代码一样重要,它应该出现在bin文件夹中,但由于某种原因,该文件丢失了,只有一些dll文件被放置在那里,实际上在整个目录中都没有pdb文件。
我的第一个问题是:无论正在开发什么类型的项目,都应该有一个pdb文件。是吗?
第二个问题是:如何重新创建该文件,或者需要执行哪些步骤才能再次调试该项目?
6个回答

7

@AdrianIftode 有时候会,有时候不会。https://dev59.com/n0XRa4cB1Zd3GeqPucfB - Thomas Langston
当项目为网站而非Web应用程序项目时,编译部分也会考虑在内。 - Adrian Iftode
2
在网站案例中,代码后面的文件是由ASP .Net编译而不是你通过Visual Studio进行编译的,因此bin文件夹中没有dll和pdb文件,这些文件在网站"在线"时由ASP .Net管理。但是bin文件夹可以包含其他的dll和pdb文件。 - Adrian Iftode
嗯,AdrianIftode提出了有趣的观察,但我仍然没有运气:(一切似乎都很好,可能是IIS的问题? - Somebody
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/6907/discussion-between-somebody-and-adrian-iftode - Somebody
显示剩余5条评论

5

我尝试了几件事情来解决这个问题:

  • 清除临时ASP.NET文件(C:\ Windows \ Microsoft .NET \ Framework {version} \ Temporary ASP.NET files {site}(您需要退出指向开发网站的Visual Studio和任何Web浏览器)
  • 启动任务管理器,右键单击W3WP.EXE进程,选择SET AFFINITY并取消选中所有CPU,只保留一个。

通常,如果我这样做,然后附加到W3WP进程进行调试,断点将被填充,我可以逐步执行我的代码。


嗨Tim,谢谢你的澄清,但我在任务管理器中看不到W3WP.EXE进程运行。还有一个问题,现在我可以像我说的那样再次调试我的网站,但我仍然有一些dll文件的符号尚未加载,你有任何修复这个问题的想法吗? - Somebody
我猜你是通过 VS 调试器而不是附加到进程来运行的。尝试删除临时 ASP.NET 文件,然后再次运行调试器。 - Tim
即使我关闭了VS,我也无法删除临时的asp.net文件,我必须注销然后重新登录,这听起来对你很奇怪吗? - Somebody
1
我也曾经遇到过IIS锁定我的文件,这一点并不奇怪。(有时候让我抓狂)尝试运行iisreset /stop命令,关闭连接到该站点的任何Web浏览器,关闭VS,然后再次尝试删除文件。完成后,请记得运行iisreset /start命令。 - Tim
谢谢,嘿你知道吗?在一些页面上断点可以正常工作(显示为填充),但在其他页面上不行,还是很奇怪的事情:s - Somebody
我仍然有两个dll:InputsSanitizer.dll和Interop.CAPICOM.dll没有加载符号,但到目前为止每个断点都被填充了,所以谢谢! - Somebody

2
要在Release中生成.pdb文件,您需要设置项目属性:
编译\高级编译选项\生成调试信息 => 'pdb-only' 或 'Full'
包/发布Web\排除生成的调试符号 => 取消勾选此选项

1

我刚遇到了这个问题,结果发现我的web.config设置为debug=false。
请确保在您的web.config中设置compilation debug=true

<compilation defaultLanguage="vb" debug="true" batch="false" targetFramework="4.0">
  <assemblies>
    <!-- add references to gac assemblies here-->
  </assemblies>
</compilation>

是的。太糟糕了,每篇关于ASP.NET安全性的文章都说这是一个重大的安全风险。想要没有安全性和堆栈跟踪中的行号吗?那就很难了... - Roman Starkov
这仅适用于生产环境,并且理所当然。 - csauve
也许在评论中讨论这个问题有点不合适,但是为什么你不能知道在生产环境中未处理的异常的行号呢? - Roman Starkov

0

关于Resource上面的回答,即使我正在运行调试版本,我也不得不将项目的发布版本(在我的情况下是NuGet包)设置为“pdbonly”来进行调试。我还使用MyGet作为符号服务器,但这样做我也可以使用本地版本进行调试。我有以下设置:

发布版本上传到MyGet NuGet包服务器 调试版本上传到MyGet符号服务器


0
在解决我的问题的过程中,我找到了这个:
首先,像Adrian Iftode所说,在网站情况下,代码后面的文件是由ASP .Net编译的,而不是由VS编译的,因此bin文件夹中没有dll和pdb文件。
所以我删除了所有临时文件:windows\Microsoft .NET\Framework\v2.0.50727\Temporary ASP.NET files\
其中包含每个项目的文件夹。
从iexplorer中删除所有临时文件
在IIS属性中,为project\Directory\Configuration\Debugging\检查调试标志下面的两个选项。
通过完成以上所有操作,我再次能够调试我的网站。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接