有没有办法在发布模式下显示 .NET 程序集构建/部署的堆栈跟踪中的行?
更新:
我的应用程序分为三个类库项目和一个 ASP.NET“网站”项目。我试图追查的错误是在三个类库项目之一中。我只为生成“对象引用未设置为对象的实例”错误的类库项目部署了 pdb 文件。
行号仍未显示在堆栈跟踪中。我是否需要为所有项目部署 pdb 文件以获取堆栈跟踪中的行号?
工作解决方案
为每个应用程序部署 pdb 文件修复了行号问题。
有没有办法在发布模式下显示 .NET 程序集构建/部署的堆栈跟踪中的行?
更新:
我的应用程序分为三个类库项目和一个 ASP.NET“网站”项目。我试图追查的错误是在三个类库项目之一中。我只为生成“对象引用未设置为对象的实例”错误的类库项目部署了 pdb 文件。
行号仍未显示在堆栈跟踪中。我是否需要为所有项目部署 pdb 文件以获取堆栈跟踪中的行号?
工作解决方案
为每个应用程序部署 pdb 文件修复了行号问题。
在 VS2012 中,您还需要在属性的“打包/发布 Web”部分中取消选中“排除生成的调试符号”。
我的解决方案
将 pdb 文件复制到与可执行文件相同的文件夹中。
现在我可以在运行 exe 文件时查看行号。
这是原因
http://msdn.microsoft.com/en-us/library/ee416588%28v=vs.85%29.aspx
过去我遇到过一些问题,我觉得需要使用发布版本部署 PDB 文件以跟踪错误。原因是,就像你说的,异常发生在一个非常大的方法中,我无法准确地确定它发生在哪里。
这可能表明该方法需要重构为更小、更细粒度的方法。不是一刀切的答案,但这种方法在短期内(我经常在重构过程中发现错误)和从长远来看对我很有帮助。
只是一个想法。
在构建/部署包中包含调试符号。
在 VS 2008 Express 中,我在 Project Properties --> Compile --> Advanced Compile Options 下找到了它。
在 .NET Core 中,您需要关闭发布模式的“优化代码”选项以显示正确的行号。
这每次都有效。您只需要对堆栈跟踪消息进行子串化。真正的容易!此外,在 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++;
}