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.AddNums
Console.WriteLine(callerMethodClass+"."+callerMethodName + "--调用-->"+ currenMethod.DeclaringType+"."+ currenMethod.Name);
StackTest.testc();
}
}
}
3. controller实现一个接口
[HttpGet]
public void NumOperation(int a,int b)
{
DataOperation.AddNums(a, b);
}