StackTrace在.Net中获取当前线程的堆栈跟踪信息
-
StackTrace的主要功能
1. 捕获调用堆栈信息:可以获取堆栈中的各个方法调用的详细信息。
2. 访问堆栈帧:可以获取每个堆栈帧中的方法、文件名和行号等信
-
StackTrace的使用
1. 创建StackTrace对象
using System.Diagnostics;
//创建一个StackTrace对象,捕获当前线程的堆栈信息
StackTrace stackTrace = new StackTrace();
2. 获取堆栈信息
//获取堆栈跟踪的字符串表示
string stackTracingString=stackTrace.ToString();
Console.WriteLine(stackTracingString);
3. 获取堆栈帧中的信息
//获取所有堆栈帧
StackFrame[] stackFrames = stackTrace.GetFrames();
foreach (StackFrame frame in stackFrames)
{Console.WriteLine("Method:"+frame.GetMethod().Name);Console.WriteLine("File:"+frame.GetFileName);Console.WriteLine("Line:"+frame.GetFileLineNumber);
}
-
示例
示例描述:程序运行过程中获取以下信息:1. 调用之间的调用关系。2.打印当前线程的对阵跟踪信息以及每个堆栈帧的详细信息。
1. 定义方法1:在方法中打印所有的堆栈信息
using System.Diagnostics;namespace PracticeProjects.Logic
{public class StackTest{public static void testc(){StackTrace stackTrace = new StackTrace(); //获取堆栈跟踪的字符串表示string stackTracingString=stackTrace.ToString();Console.WriteLine(stackTracingString);//获取所有堆栈帧StackFrame[] stackFrames = stackTrace.GetFrames();foreach (StackFrame frame in stackFrames){Console.WriteLine("Method:"+frame.GetMethod().Name);Console.WriteLine("File:"+frame.GetFileName);Console.WriteLine("Line:"+frame.GetFileLineNumber);}}}
}
2. 定义方法2:打印该方法的调用方与此方法之间的调用关系
using System.Diagnostics;
namespace PracticeProjects.Logic
{public class DataOperation{public static void AddNums(int a, int b){var stack = new StackTrace(false);//创建一个StackTrace实例,true表示想收集源文件信息,比如文件名和行号,设置为true会影响性能,一般用不到var callerframe = stack.GetFrame(1);//获取调用栈中的特定帧。0表示当前方法,1表示上一个方法var callerMethodName = callerframe.GetMethod().Name;//获取该方法的名称var callerMethodClass = callerframe.GetMethod().DeclaringType;//获取方法所在的类var currentFrame= stack.GetFrame(0);var currenMethod=currentFrame.GetMethod();//打印该方法的调用方与该方法之间的调用关系//PracticeProjects.Controllers.DbOperateController.NumOperation--调用-->PracticeProjects.Logic.DataOperation.AddNumsConsole.WriteLine(callerMethodClass+"."+callerMethodName + "--调用-->"+ currenMethod.DeclaringType+"."+ currenMethod.Name);StackTest.testc();}}
}
3. controller实现一个接口
[HttpGet]
public void NumOperation(int a,int b)
{DataOperation.AddNums(a, b);
}