尽管包含了PDB文件,但堆栈跟踪中缺少行号

8
这让我很困扰。我使用VS 2008用C#实现了这个Web服务,并在IIS上发布它。我修改了发布版本,以便将pdb文件与dll文件一起复制到inetpub目标目录中。
同时,web.config文件中debug=true。
然后我调用一个抛出异常的Web服务。堆栈跟踪不包含行号。我不知道我错过了什么,请问有什么想法吗?
附加信息: 如果我使用VS内置的Web服务器运行Web应用程序,则可以正常工作,并且在堆栈跟踪中获得行号。但是,如果我将VS内置Web服务器使用的相同文件(pdb和dll)复制到IIS中,堆栈跟踪中仍然缺少行号。
似乎与忽略pdb文件有关!
更新: 当我发布到IIS时,所有pdb文件都会发布到bin目录下,一切看起来都很好。但是,当我进入“C:\ Windows \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files”并进入与我的项目相关的特定目录时,我可以看到程序集(.dll)文件都在那里,但没有pdb文件。
但是,如果我使用VS内置的Web服务器运行项目,则不会发生这种情况。 因此,如果我手动将pdb文件复制到临时文件夹中,则可以看到行号。
请问为什么不会将pdb文件复制到临时文件夹中?
顺便说一下,当我附加到工作进程时,可以看到它说符号已加载!

你是否正在使用WCF来调用该Web服务? - Rubens Farias
5个回答

3
我曾经遇到过相同的问题,并尝试了各种方法来解决它。直到我在这个类似的问题中找到了被接受的答案:即使有pdb,IIS也没有在堆栈跟踪中提供行号

结果发现是使用web.config中的模拟功能:

<identity impersonate="true" />

导致堆栈跟踪中的行号丢失。我将其删除后,我的行号恢复了,再将其放回,并在几个小时后(Kerberos票证刷新?)行号再次消失。

不确定模拟用户为什么会影响堆栈跟踪,但它确实会-希望有人能确认/解释这一点……

我需要大部分站点开启模拟用户(并且这些站点有行号,很奇怪),因此我为此特定网站禁用了模拟用户并获得了我的行号!


1
这是唯一对我有效的解决方案。希望“impersonate=true”不是我的网站所需的东西。 - Arvin
1
谢谢,这是微软那些隐藏的小副作用之一,可能会让你浪费很多时间。 - f.cipriani

0
也许你要发布到的服务器在系统的machine.config文件中配置了<deployment retail="true" />设置。

C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG

更多信息请参见:

ASP.NET配置 - 部署元素(ASP.NET设置模式)

只是一个想法。


我检查了那个文件,发现里面没有 <deployment retail="true" />。 - kaptan
在上面链接的帖子https://dev59.com/K03Sa4cB1Zd3GeqPt0q3#2673642的评论中,用户@Graeme表示,如果您这样做,它会完全关闭堆栈跟踪,而不仅仅是关闭行号。 - Joshua Frank

0

使用VS或Windbg连接到工作进程,查看它是否能够找到您的pdb文件以及它是否与您的程序集匹配?

另一个常见原因是您实际上正在使用已优化的发布dll。我怀疑这与IIS无关。


.pdb文件可以与“Release”或优化的dll一起使用,没有问题。我已经做过很多次了。 - Dave Black

0
请确保在web.config中设置"debug=true",否则异常中不会显示行号。

0

不确定这是否有帮助,但在我的VS2008 C#项目属性中,在构建选项卡下,有一个高级按钮,我必须将调试信息设置为“full”或“pdb-only”


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