C# 我可以用堆栈跟踪检索实际的代码行吗?
我为我的ASP.NET应用程序提供了一个快速而肮脏的单元测试框架——一个ASPX页面,其中包含一个比较预期结果和实际结果并创建表的方法。它可以根据需要进行编译,让我能够快速创建和运行一系列测试,即使没有运行VS.NET 下面是一个示例调用:C# 我可以用堆栈跟踪检索实际的代码行吗?,c#,stack-trace,C#,Stack Trace,我为我的ASP.NET应用程序提供了一个快速而肮脏的单元测试框架——一个ASPX页面,其中包含一个比较预期结果和实际结果并创建表的方法。它可以根据需要进行编译,让我能够快速创建和运行一系列测试,即使没有运行VS.NET 下面是一个示例调用: PrintResult( expected: "$A$1", actual: RST.ExcelReference.FormatReferences("{{REF:1:0:1:0}}", false, 0, 0), argumen
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)");
(为了清晰起见,添加了命名参数。)
正如您所想象的,同步实际呼叫和该呼叫的显示是一件痛苦的事情
我知道我无法在环境.StackTrace
中检查参数值,只能检查方法定义和行号。但在我的例子中,我不需要实际的参数值。我通常使用文本作为参数来调用这个方法,所以我只需要堆栈跟踪中PrintResult()入口点的一行源代码
源代码似乎在某种程度上可供ASP.NET使用,就像出现未处理的异常时一样。如何访问它?
环境。StackTrace
为您提供堆栈跟踪每行中的文件名和行号。它的格式清晰,应该易于解析。发件人:
StackTrace属性为每个堆栈设置堆栈跟踪信息的格式
方法调用如下所示:
“在FileName:line中的FullClassName.MethodName(MethodParams)处
行号“
文字“at”前面有三个空格,文字“in”
如果调试符号不可用,则省略“:行”。这个
占位符、FullClassName、MethodName、MethodParms、文件名和
行号,由定义如下的实际值替换:
FullClassName类的全名,包括名称空间
MethodName方法的名称
MethodParms参数类型/名称对的列表。每对都是
由逗号(“,”)分隔。如果MethodName
接受零参数
FileName方法所在的源文件的名称
宣布。如果未使用调试符号,则忽略此信息
可用
LineNumber文件名中包含源的行号
调用堆栈上指令的MethodName中的代码。
如果调试符号不可用,则忽略此信息
在问题中,您暗示
Environment.StackTrace
不是您问题的答案,但似乎您应该能够解析出源文件名和行号,然后从文件中读取该行。我错过了什么?这正是我目前正在做的事情。。。将ASPX的源代码(Request.PhysicalPath)读入字符串列表,并打印帧的GetFileLineNumber()-1
行。直接阅读源代码似乎有点奇怪,认为可能有一种更优雅的方式。(我实际上使用的是新系统.Diagnostics.StackTrace(true)
,而不是环境.StackTrace
,因此不需要解析字符串。)