2010-09-24 185 views
25

MSDN说,这对Exception类的StackTrace属性:如何获得在.NET抛出异常的堆栈跟踪行号(S)现身

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

所以我知道这个信息是可用的。如何让行号实际显示在堆栈跟踪中?我的代码在通过TONS对象的非常困难和复杂的代码段中抛出异常,所以我不想跨越数十亿次来查看发生异常的位置。异常的堆栈跟踪仅显示方法签名并且没有行号。

+0

如果您正在调试代码,您可以告诉Visual Studio在“调试”菜单中突破异常。 – 2010-09-24 23:42:34

+2

如果我知道抛出异常的行号,我可以这样做。 – 2010-09-27 17:15:40

回答

31

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

alt text

将其设置为full应该足够了(见Advanced Build Settings Dialog Box docs什么其他选择呢)。调试信息(即PDB文件)默认为Debug版本配置生成,但也可以为Release版本配置生成。

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

+1

MSDN表示除非设置/调试:完全不能远程调试。我想知道这是否意味着如果你设置了/ debug:full,即使没有源代码和/ debug,你也可以使用源代码进行附加和调试:如果你有源代码并且不介意偶尔错误执行点,那么pdbonly就足够了。 – axk 2011-06-08 13:16:27

+10

这似乎不起作用,我已经设置完整,但我的堆栈跟踪中没有行号。 – msbg 2012-10-09 20:31:29

+2

@msbg - 1)。你确定你将它设置为debug和release版本吗? 2)。行号只会显示您的代码...像这样:TestApp \ test.aspx.cs中的my_code.temp.cmdBoom_Click(Object sender,EventArgs e):行1245 at System.Web.UI.WebControls.Button.OnClick (EventArgs e) at System.Web.UI.WebControls.Button.RaisePostBackEvent(String eventArgument) at System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)... also你没有选中“优化代码”? – mike 2016-04-29 17:45:17

5

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

+1

我的PDB在那里,一切都设置正确。还是不行。 – 2010-09-27 17:13:51

-10

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

现在异常显示行号。

+1

嗨,我不认为这是有道理的... – Yuki 2013-08-11 11:30:38

+2

这是显示行号,而不是堆栈跟踪上的行号。 – RemarkLima 2013-09-18 12:26:43

0

除了其他很棒的建议,我们正在部署到IIS。我们有一台登台服务器和一台生产服务器。他们似乎是一样的,除了分期给我们的线路号码和生产没有。事实证明,在生产的bin目录中有一个额外的DLL(它恰巧是SqlServerSpatial.dll fwiw),并且一旦它移动到系统目录中,开始出现在生产线上的行号。

课程是确保生产的bin目录与各个方面的开发bin目录(XML文件除外)相匹配。

5

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

Visual Studio 2012 Website Publish Not Copying .pdb files

具体来说,您应该包括

<YOUR_PROJECT>\Properties\PublishProfiles\*.pubxml 

文件(S)为您的项目如下设置:

<PropertyGroup> 
    <ExcludeGeneratedDebugSymbol>False</ExcludeGeneratedDebugSymbol> 
</PropertyGroup> 
+0

如果你*使用MSBuild,例如使用* Package *配置和Web Deploy,可以将相同的元素添加到Web项目的* .csproj *文件中。 – 2015-07-20 14:49:47

4

由于组件有一个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(); 
} 
相关问题