当前位置: 首页 > article >正文

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);
}

http://www.kler.cn/news/309892.html

相关文章:

  • 【MySQL】MySQL连接池原理与简易网站数据流动是如何进行
  • mysql笔记7(单表查询)
  • 计算机毕业设计 健身房管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • Github 2024-09-12 Go开源项目日报Top10
  • 智能车镜头组入门(二)电路硬件的设计
  • mysql的高级查询:函数的运用(日期/数字/字符/聚合)及分组查询
  • 清理C盘缓存的垃圾,专业清理C盘缓存垃圾的步骤与策略
  • 深度学习-点击率预估-研究论文2024-09-14速读
  • LeetCode 每日一题 2024/9/9-2024/9/15
  • 计算机毕业设计 扶贫助农系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • qt-creator-10.0.2之后版本的jom.exe编译速度慢下来了
  • JVM: JDK内置命令 - JPS
  • 计算机毕业设计 《计算机基础》网上考试系统的设计与实现 Java实战项目 附源码+文档+视频讲解
  • Java入门程序-HelloWorld
  • 实习项目|苍穹外卖|day11
  • 【机器学习-监督学习】集成学习与梯度提升决策树
  • vue3+ant design vue实现可编辑表格弹出气泡弹出窗~
  • Day 72
  • 在k8s中,客户端访问服务的链路流程,ingress--->service--->deployment--->pod--->container
  • 【大数据】探索怎么从一段话中解析关键信息(寄件人相关信息)
  • 体感魂斗罗(一)
  • vue 数组转字符串以逗号分隔
  • 9.18 C++对C的扩充
  • AI逻辑推理入门
  • 钢材表面缺陷数据集以coco格式做好了数据集的划分,1200张训练集,600张验证集,对应的json文件也在里面
  • 腾讯 IEG 游戏前沿技术 二面复盘
  • python如何实现队列
  • 18063 圈中的游戏
  • 身份证阅读器API模式 VUE Dorado7
  • 计数服务怎么设计?