我可以使用堆栈跟踪检索实际的代码行吗?

时间:2012-08-03 15:35:54

标签: c# stack-trace

我的ASP.NET应用程序有一个快速而又脏的单元测试框架 - 一个ASPX页面,其中一个方法可以比较预期结果和实际结果,并创建一个表。它可以根据需要进行编译,让我可以快速创建和运行一系列测试,即使没有运行VS.NET。

以下是一个示例电话:

PrintResult(
   expected:  "$A$1", 
   actual:    RST.ExcelReference.FormatReferences("{{REF:1:0:1:0}}", false, 0, 0),
   arguments: "RST.ExcelReference.FormatReferences(\"{{REF:1:0:1:0}}\", false, 0, 0)");

(为了清楚起见,添加了命名参数。)

您可以想象,同步实际调用和该调用的显示是一件痛苦的事。

我知道我无法检查Environment.StackTrace中的参数值,只检查方法定义和行号。但就我而言,我不需要实际的参数值。我通常使用文字作为参数调用此方法,因此我需要的是在堆栈跟踪中进入PrintResult()的入口点的源代码行。

源代码似乎以某种方式可用于ASP.NET,因为它出现在未处理的异常时。我该如何访问它?

1 个答案:

答案 0 :(得分:2)

Environment.StackTrace为您提供堆栈跟踪每行中的文件名和行号。它格式清晰,应易于解析。来自the documentation

  

StackTrace属性格式化每个堆栈跟踪信息   方法调用如下:

     

“在FullClassName。FileName中的MethodName(MethodParams):line   LineNumber“

     

文字“at”前面有三个空格,文字“in”   如果调试符号不可用,则省略“:line”。该   占位符,FullClassName,MethodName,MethodParms,FileName和   LineNumber由实际值替换,如下所示:

     

FullClassName类的全名,包括命名空间。

     

MethodName方法的名称。

     

MethodParms参数类型/名称对的列表。每一对都是   用逗号分隔(“,”)。如果是MethodName,则省略此信息   取零参数。

     

FileName MethodName方法所在的源文件的名称   声明。如果没有调试符号,则省略此信息   可用。

     

LineNumber FileName中包含源的行数   MethodName中的代码,用于调用堆栈上的指令。   如果调试符号不可用,则省略此信息。

在您提出的问题中,Environment.StackTrace不是您问题的答案,但似乎您应该能够解析出源文件名和行号,然后从文件中读取该行。我错过了什么?