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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值