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


139

有没有一种方法可以显示在发布模式下以.NET程序集构建/部署的堆栈跟踪中的行?

更新:

我的应用程序分为三个类库项目和一个ASP.NET“网站”项目。我尝试查找的错误是在三个类库项目之一中。我只为生成“对象引用未设置为对象实例”错误的类库项目部署了pdb文件。

行号仍未显示在堆栈跟踪中。我是否需要为所有项目部署pdb文件才能在堆栈跟踪中获取行号?

工作方案

为每个应用程序部署pdb文件解决了行号问题。

Answers:


147
  • 进入要查看堆栈跟踪行号的项目的“属性”窗口。
  • 单击构建“垂直选项卡”。
  • 选择“发布”配置。检查DEBUG常数参数。
  • 取消选中“优化代码”参数以避免内联代码偶尔出现跟踪问题(此步骤不是必需的)。
  • 按高级...按钮,然后选择输出->调试信息->仅pdb。
  • 与程序集一起部署生成的.pdb文件。

通过以下注释实现:

  • 要检查的另一件事是在“打包/发布网站”部分中,也未选中“排除生成的调试符号”复选框

2
我是否必须将pdb文件与程序集一起部署?
迈克尔·肯尼斯肯

7
是。这就是调试符号和行号所在的位置。
约翰·桑德斯

5
如果没有必要,您可能不想公开此信息。用它来调试客户端问题,是的。但是您并不总是想要这样做,因为调试信息可以泄露敏感数据并成为攻击媒介。取决于您的应用程序。
i_am_jorf

6
@Carlo:调试信息也适用于发布(优化)代码,但是调试在某种程度上受到限制(stackoverflow.com/questions/113866)。但是,即使在优化的代码中,调用栈也非常可靠,但内联函数和偶尔会丢失尾部调用的特殊情况除外,因为调用xxx / ret序列已被jmp xxx取代。
Suma 2010年

12
另一件事要检查的是“打包/发布Web”部分中的“排除生成的调试符号”复选框也未选中
Gaz 2014年

17

在VS2012中,您还需要在属性的“打包/发布Web”部分中取消选中“排除生成的调试符号”。


或如果它是桌面应用程序,请确保已部署PDB文件
CAD


9

过去,我遇到了一些问题,在这些问题中,我需要使用发布版本来部署PDB文件,以便跟踪错误。就像您说的那样,原因是异常发生在一种非常大的方法中,我无法准确查明发生的位置。

这可能表明该方法需要重构为更小,更精细的方法。并非所有解决方案都适合所有人,但从短期(从重构的角度来看,我经常发现该错误)和长期来看,这种方法对我很有用。

只是一个想法。


这个。然后,在较粗略的地方以较细的颗粒投掷尝试捕获物。如果必须做一些假设,则在这些功能开始时增加警卫。
杰拉德·奥尼尔

经常说这样的话,确实如此,但是有很多遗产,有程序员在编写新的大型方法,有时大型方法实际上是最好的做法(将其弄糊涂或混淆)。另外,即使是5线方法-你缩小搜索范围的5倍-如此PDBS是在生产中需要的邪恶,除非你采取使用符号服务器的痛苦
FastAl


0

在VS 2008 Express中,我在项目属性->编译->高级编译选项下找到它。


1
你发现了什么?如果您不想发布完整的答案,则可以发表评论。
jumxozizi

-4

每次都有效。您只需要为堆栈跟踪消息添加字符串。真容易!另外,在vb.net中,您确实需要执行“显示所​​有文件”并包含pdb。

'Err is the exception passed to this function

Dim lineGrab As String = err.StackTrace.Substring(err.StackTrace.Length - 5)
Dim i As Integer = 0
While i < lineGrab.Length                   
    If (IsNumeric(lineGrab(i))) Then
        lineNo.Append(lineGrab(i))
    End If
    i += 1
End While

'LineNo holds the number as a string

C#版本:

string lineGrab = error.StackTrace.Substring(error.StackTrace.Length - 5);

int i = 0;
int value;
while (i < lineGrab.Length)
{
    if (int.TryParse(lineGrab[i].ToString(), out value))
    {
        strLineNo.Append(lineGrab[i]);
    }
    i++;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.