即使包含 PDB 文件,堆栈跟踪中也缺少行号

Posted

技术标签:

【中文标题】即使包含 PDB 文件,堆栈跟踪中也缺少行号【英文标题】:Missing line number in stack trace eventhough the PDB files are included 【发布时间】:2010-02-04 23:43:21 【问题描述】:

这让我发疯了。我使用 VS 2008 使用 C# 实现了这个 Web 服务。我在 IIS 上发布它。我已经修改了发布版本,因此 pdb 文件与 dll 一起复制到 inetpub 上的目标目录中。

web.config 文件也有 debug=true。

然后我调用一个引发异常的 Web 服务。堆栈跟踪不包含行号。我不知道我在这里缺少什么,有什么想法吗?

其他信息: 如果我使用 VS 内置的 Web 服务器运行 Web 应用程序,它可以工作,并且我会在堆栈跟踪中获得行号。但是,如果我将 VS 内置 Web 服务器正在使用的相同文件(pdb 和 dll)复制到 IIS,堆栈跟踪中仍然缺少行号。

似乎与忽略pdb文件的IIS有关!

更新 当我发布到 IIS 时,所有 pdb 文件都发布在 bin 目录下,一切看起来都很好。但是当我转到与我的项目相关的特定目录下的“C:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files”时,我可以看到程序集(.dll)文件都在那里,但没有 pdb 文件。 但是,如果我使用 VS 内置 Web 服务器运行项目,则不会发生这种情况。 因此,如果我手动将 pdb 文件复制到 temp 文件夹,我可以看到行号。

知道为什么不将 pdb 文件复制到临时文件夹吗?

顺便说一句,当我附加到工作进程时,我可以看到它说符号已加载!

【问题讨论】:

您是否使用 WCF 调用该 Web 服务? IIS not giving line numbers in stack trace even though pdb present的可能重复 【参考方案1】:

我遇到了同样的问题,并在阳光下尝试了所有方法来尝试修复它。直到我在这个类似的问题中找到公认的答案之前,没有任何效果:IIS not giving line numbers in stack trace even though pdb present。

事实证明,在 web.config 中使用了模拟:

<identity impersonate="true" />

导致堆栈跟踪中的行号丢失。我把条目拿出来,我的行号又回来了,把它放回去,几个小时后(Kerberos 票刷新?)行号又消失了。

不确定为什么模拟会影响堆栈跟踪,但确实会 - 很高兴有人确认/解释这一点...

我需要为我的大多数网站启用模拟(并且这些网站都有行号,去看看)所以我为这个特定网站禁用了它并获得了我的行号!!

【讨论】:

这是唯一对我有用的解决方案。我希望我的网站不需要“impersonate=true”。 谢谢,这是微软隐藏的小副作用之一,会让你浪费很多时间【参考方案2】:

也许您要发布到的服务器在系统machine.config 文件中配置了&lt;deployment retail="true" /&gt; 设置:

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

更多信息见:

ASP.NET configuration - deployment Element (ASP.NET Settings Schema)

只是一个想法。

【讨论】:

我检查了该文件,该文件中没有 在上面链接的帖子***.com/questions/2673623/… 的评论中,用户@Graeme 说如果你这样做,它会完全关闭堆栈跟踪,而不仅仅是行号。【参考方案3】:

使用 VS 或 windbg 附加到工作进程,看看它是否能够找到您的 pdb 以及它是否与您的程序集匹配?

另一个常见原因是您实际上使用的是发布 dll [已优化]。我怀疑这与 IIS 有什么关系。

【讨论】:

.pdb 文件可以毫无问题地与“发布”或优化的 dll 一起使用。我已经做过很多次了。【参考方案4】:

请确保在web.config中设置“debug=true”,没有它,异常中不会显示行号。

【讨论】:

【参考方案5】:

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

【讨论】:

以上是关于即使包含 PDB 文件,堆栈跟踪中也缺少行号的主要内容,如果未能解决你的问题,请参考以下文章

在堆栈跟踪中获取 VB.NET 行号

在发布模式下显示 .NET 程序集的堆栈跟踪中的行号

为啥我的异常堆栈跟踪总是指向最后一个方法行?

Kotlin 代码堆栈跟踪显示 Java 行号

python代码调试工具~pdb

UWP 应用的堆栈跟踪中的行号