Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获取.NET中抛出的异常的StackTrace中的行号以显示_C#_.net_Exception_Stack Trace - Fatal编程技术网

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

C# 如何获取.NET中抛出的异常的StackTrace中的行号以显示,c#,.net,exception,stack-trace,C#,.net,Exception,Stack Trace,MSDN是关于Exception类的StackTrace属性的: StackTrace属性保存堆栈 跟踪,您可以使用它来确定 代码中发生错误的位置。 StackTrace列出所有被调用的 异常之前的方法 以及源代码中的行号 打电话的地方 所以我知道这些信息是可用的。如何使行号实际显示在堆栈跟踪中?我的代码在一段非常困难和复杂的代码中抛出了一个异常,这段代码涉及大量对象,因此我不想一步一步地查看异常发生的位置。异常的堆栈跟踪只显示方法签名,没有行号。您必须在启用pdb文件的情况下构建项目,并确保在

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

StackTrace属性保存堆栈 跟踪,您可以使用它来确定 代码中发生错误的位置。 StackTrace列出所有被调用的 异常之前的方法 以及源代码中的行号 打电话的地方


所以我知道这些信息是可用的。如何使行号实际显示在堆栈跟踪中?我的代码在一段非常困难和复杂的代码中抛出了一个异常,这段代码涉及大量对象,因此我不想一步一步地查看异常发生的位置。异常的堆栈跟踪只显示方法签名,没有行号。

您必须在启用pdb文件的情况下构建项目,并确保在应用程序中部署pdb文件。通过右键单击需要pdb文件的程序集,然后转到“属性”>“生成”>“高级”,并确保“输出调试信息”下的设置为“完整”,可以检查是否确实正在为配置生成pdb文件

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

将其设置为
full
就足够了(有关其他选项的功能,请参阅)。默认情况下,会为调试生成配置生成调试信息(即PDB文件),但也可以为发布生成配置生成调试信息


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

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


现在,异常显示为行号。

除其他重要建议外,我们还将部署到IIS。我们有一台临时服务器和一台生产服务器。他们看起来一模一样,只是舞台给了我们生产线号,而生产线却没有。事实证明,在产品的bin目录中有一个额外的DLL(它恰好是SqlServerSpatial.DLL fwiw),一旦它被移动到系统目录,行号就开始出现在产品上


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

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

具体来说,您应该在

<YOUR_PROJECT>\Properties\PublishProfiles\*.pubxml
\Properties\PublishProfiles\*.pubxml
项目的文件:

<PropertyGroup>
  <ExcludeGeneratedDebugSymbol>False</ExcludeGeneratedDebugSymbol>
</PropertyGroup>

假的

如果程序集有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();
}

如果您正在调试代码,可以告诉Visual Studio在“调试”菜单中中断异常。如果我知道引发异常的行号,我可以这样做。我的PDB在那里,并且所有设置都正确。MSDN仍然表示,除非设置/debug:full,否则无法进行远程调试。我想知道这是否意味着,如果您设置/debug:full,即使没有源代码,您也可以附加和调试源代码;如果您有源代码并且不介意偶尔错误放置执行点,那么/debug:pdbonly就足够了。这似乎不起作用,我将其设置为full,但堆栈跟踪中没有行号。@msbg-1)。您确定为调试版本和发布版本都设置了它吗?2). 行号将仅显示您的代码。。。如下所示:TestApp\test.aspx.cs中的my_code.temp.cmdBoom_Click(Object sender,EventArgs e):System.Web.UI.WebControls.Button的第1245行。System.Web.UI.WebControls.Button的OnClick(EventArgs e)在System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.raisepostbackeventargent(String-eventArgument)中的raisepostbackeventeventhandler(String-eventArgument) ... 你还取消了“优化代码”的选择吗?@mike感谢你显示它将位于路径的末尾。您可以将其添加到您的答案中吗?应该注意,对于通过VSCode的.NET核心项目,您可以通过向
.csproj
文件添加
Full
来完成与上述相同的操作。我的日志现在显示行号而不是0。这是显示行号,而不是堆栈跟踪上的行号。如果您使用的是MSBuild,例如,在包配置和Web部署中,可以将相同的
元素添加到Web项目的.csproj文件中。