如何在StackTrace中获取.NET中抛出的异常中的行号以显示

Chr*_*rry 33 .net c# exception stack-trace

MSDN说这个关于该类的StackTrace属性Exception:

StackTrace属性包含堆栈跟踪,您可以使用它来确定错误发生在代码中的哪个位置.StackTrace列出了异常之前的所有被调用方法以及进行调用的源中的行号.

所以我知道这些信息是可用的.如何获得实际显示在堆栈跟踪中的行号?我的代码在一个非常困难和复杂的代码中抛出一个异常,它通过TONS的对象,所以我不想经过几十年的时间来查看异常发生的位置.异常的堆栈跟踪仅显示方法签名而不显示行号.

adr*_*nks 42

要获取StackTrace中的行号,您需要在dll/exes旁边拥有正确的调试信息(PDB文件).要生成调试信息,请在Project Properties -> Build -> Advanced -> Debug Info以下位置设置选项:

替代文字

将其设置为full足够(有关其他选项的作用,请参阅高级构建设置对话框文档).默认情况下会为Debug构建配置生成调试信息(即PDB文件),但也可以为Release构建配置生成调试信息(即PDB文件).

为发布版本生成PDB使您可以在没有PDB的情况下发送代码,但是如果需要行号(或者甚至连接远程调试器),则将PDB放在dll旁边.需要注意的一点是,在发布版本中,由于编译器或JIT编译器的优化,行号可能不完全正确(如果行号显示为0,则尤其如此).

  • 这似乎不起作用,我已将其设置为完整但我的堆栈跟踪中没有行号. (12认同)
  • @msbg - 1).您确定为调试和RELEASE构建设置了它吗?2).行号仅显示您的代码...如下所示:TestApp\test.aspx.cs中的my_code.temp.cmdBoom_Click(Object sender,EventArgs e):System.Web.UI.WebControls.Button.OnClick上的第1245行( EventArgs e)System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument)at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)...你也取消选中"优化代码"? (2认同)

Jai*_*han 6

您必须在启用pdb文件的情况下构建项目,并确保使用您的应用程序部署pdb文件.您可以通过右键单击需要pdb文件的程序集来检查pdb文件是否实际上是为您配置的,然后转到Properties> Build> Advanced并确保在Output Debug Info下设置为full.

  • 我的PDB在那里,一切都设置正确.还是不行. (2认同)

Pet*_*uck 6

如果您使用VS2012或更高版本的Web应用程序或Web服务项目,则更改构建设置将不起作用.相反,您应该遵循本文中的建议:

Visual Studio 2012网站发布不复制.pdb文件

具体来说,您应该在中包含以下设置

<YOUR_PROJECT>\Properties\PublishProfiles\*.pubxml
Run Code Online (Sandbox Code Playgroud)

您项目的文件:

<PropertyGroup>
  <ExcludeGeneratedDebugSymbol>False</ExcludeGeneratedDebugSymbol>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)


chr*_*dam 6

鉴于程序集有一个pdb文件,您可以尝试以下操作:

try
{
    throw new Exception();
}
catch (Exception ex)
{
    // Get line number from the stack trace's top frame for the exception with source file information
    int linenumber = (new StackTrace(ex, true)).GetFrame(0).GetFileLineNumber();
}
Run Code Online (Sandbox Code Playgroud)