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

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

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

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

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

替代文字

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

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

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

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

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

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

 \Properties\PublishProfiles\*.pubxml 

您项目的文件:

  False  

鉴于程序集有一个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(); } 

除了其他伟大的建议,我们正在部署到IIS。 我们有一个临时服务器和一个生产服务器。 它们看起来完全相同,除了分期给我们行号而生产没有。 事实certificate,生产的bin目录中有一个额外的DLL(它恰好是SqlServerSpatial.dll fwiw),一旦它被移动到系统目录,行号开始出现在生产中。

我们的教训是确保生产的bin目录在各方面都与开发的bin目录相匹配(XML文件除外)。

似乎找到了解决方案。 至少在VS2010上,输出调试信息设置为完全,我也没有在exception中获得行号。 似乎是在编辑器中打开行号。 (工具 – >选项 – >文本编辑器 – >所有语言 – >常规 – >显示 – >行号)

现在exception显示行号。