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

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

更新:

我的应用程序分为三个类库项目和一个 ASP.NET“网站”项目。我试图跟踪的错误是三个类库项目中的一个。我只为生成“ Object reference not set to an instance of an Object”错误的类库项目部署 pdb 文件。

堆栈跟踪中仍然没有显示行号。是否需要为所有项目部署 pdb 文件以获取堆栈跟踪中的行号?

工作解决方案

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

97300 次浏览

在构建/部署包中包含调试符号。

  • 进入要查看堆栈跟踪行号的项目的“属性”窗口。
  • 点击构建“垂直选项卡”。
  • 选择“发布”配置
  • 取消选中“ Optimize code”参数,以避免偶尔出现内联代码的跟踪问题(这一步并不重要)。
  • 按 Advanced... 按钮并选择 Output-> Debug Info-> pdb-only。
  • 使用程序集部署生成的.pdb 文件。

执行时附有以下评论意见:

  • 另一件需要检查的事情是在“ Package/PublishWeb”部分中,“ ExcluseGenerateddebug symbly”复选框也没有被选中

在 VS 2008 Express 中,我在 Project Properties —— > Compile —— > Advanced Compile Options 下找到了它。

我的解决办法

将 pdb 文件复制到与可执行文件相同的文件夹中。

现在我可以在运行 exe 文件时查看行号。

这就是原因

Http://msdn.microsoft.com/en-us/library/ee416588%28v=vs.85%29.aspx

过去,我曾遇到过这样的问题: 为了跟踪一个错误,我觉得需要部署带有发布版本的 PDB 文件。原因是,就像你说的,异常发生在一个非常大的方法中,我不能准确地指出异常发生的位置。

这可能表明需要将该方法重构为更小、更细粒度的方法。没有一种方法适合所有的答案,但是这种方法在短期内(我经常在重构过程中发现这个缺陷)和长期来看对我都很有用。

只是个想法。

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

这招屡试不爽。您只需要为堆栈跟踪消息添加子字符串。真的很简单!另外,在 vb.net 中,您需要执行“ Show All Files”并包含 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++;
}

在.NET Core 中,你需要关闭发布模式的“优化代码”选项来显示正确的行号。

控制代码生成的 C # 编译器选项