专栏首页明丰随笔浅谈StackTrace类

浅谈StackTrace类

在写通用组件的时候,我们需要关心程序运行的堆栈信息。堆栈信息是什么?

堆栈是一种执行“后进先出”算法的数据结构。程序的函数调用是用堆栈实现的。

在程序中,每次调用一个函数,就会生成一个堆栈帧,并push进入堆栈中。每一次结束一个函数调用,就会从堆栈中pop一个堆栈帧。

在.Net Framework中,定义了StackTrace类,它可以获取当前堆栈的每一帧的信息。

它的构造函数:

//默认不获取文件信息
StackTrace();
//是否获取文件信息,包括文件名,行号等
StackTrace(bool fNeedFileInfo);
//可以指定跳过帧的数量
StackTrace(int skipFrames);
StackTrace(int skipFrames, bool fNeedFileInfo);
//根据提供的Exception对象,生成堆栈信息
StackTrace(Exception e);
StackTrace(Exception e, bool fNeedFileInfo);
StackTrace(Exception e, int skipFrames);
StackTrace(Exception e, int skipFrames, bool fNeedFileInfo);

它的属性:

//返回堆栈信息的帧的数量
int FrameCount;

它的方法:

//返回堆栈信息的所有帧
StackFrame[] GetFrames();
//根据帧的索引,返回帧
StackFrame GetFrame(int index);

StackFrame类提供的方法:

int GetFileLineNumber();
int GetFileColumnNumber();
string GetFileName();
MethodBase GetMethod();

做一个简单的练习:

static void Main(string[] args)
{
  StackTraceSample stackTraceSample = new StackTraceSample();
  try
  {
    stackTraceSample.MyPublicMethod();
  }
  catch (Exception e)
  {
    // Create a StackTrace that captures
    // filename, line number, and column
    // information for the current thread.
    StackTrace st = new StackTrace(e, true);
    string stackIndent = "";
    for (int i = 0; i < st.FrameCount; i++)
    {
      // Note that high up the call stack, there is only
      // one stack frame.
      StackFrame sf = st.GetFrame(i);
      Console.WriteLine();
      Console.WriteLine(stackIndent + " Method: {0}",
        sf.GetMethod());
      Console.WriteLine(stackIndent + " File: {0}",
        sf.GetFileName());
      Console.WriteLine(stackIndent + " Line Number: {0}"
        , sf.GetFileLineNumber());
      stackIndent += "  ";
    }
  }
  Console.ReadKey();
}

public class StackTraceSample
{
  public void MyPublicMethod()
  {
    MyProtectedMethod();
  }
  protected void MyProtectedMethod()
  {
    MyInternalClass mic = new MyInternalClass();
    mic.ThrowsException();
  }
  class MyInternalClass
  {
    public void ThrowsException()
    {
      try
      {
        throw new Exception("A problem was encountered.");
      }
      catch (Exception)
      {
        // Create a StackTrace that captures filename,
        // line number and column information.
        StackTrace st = new StackTrace(true);
        string stackIndent = "";
        for (int i = 0; i < st.FrameCount; i++)
        {
          // Note that at this level, there are four
          // stack frames, one for each method invocation.
          StackFrame sf = st.GetFrame(i);
          Console.WriteLine();
          Console.WriteLine(stackIndent + " Method: {0}",
            sf.GetMethod());
          Console.WriteLine(stackIndent + " File: {0}",
            sf.GetFileName());
          Console.WriteLine(stackIndent + " Line Number: {0}"
            ,sf.GetFileLineNumber());
          stackIndent += "  ";
        }
        throw;
      }
    }
  }
}

运行的结果:

我们这里的堆栈信息并不能获取每一个函数在调用的时候,传递的参数值,对于有这种需求的程序员,可以考虑使用AOP编程的方式编写一个MethodContextLogger组件,这个组件可以获取方法的出入的参数值,并记录下来。关于如何实现AOP编程,可以参考我之前的文章。

-纸上得来终觉浅,绝知此事要躬行-

本文分享自微信公众号 - 明丰随笔(liumingfengwx2),作者:刘明丰

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Windows服务小结 1

    Windows 服务(即,以前的 NT 服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。

    小蜜蜂
  • AOP编程

    Aspect Oriented Programming(AOP),面向切面编程。AOP主要解决的问题是针对业务处理过程中对一些逻辑进行切面提取,它可以分散在处理...

    小蜜蜂
  • WCF学习笔记 4

    其中应用在ServiceContractAttribute服务契约特性上的特性[AttributeUsage(AttributeTargets.Class)]表...

    小蜜蜂
  • 策略模式(Strategy)

    - 1.Strategy:策略接口,用来约束一系列具体的策略算法。Context使用这个接口来调用具体的策略,实现定义的策略。

    qubianzhong
  • 数据结构--树状数组

    树状数组的核心函数lowbit(int m):作用是求出 m 的二进制表示的末尾1的位置,对于要查询 m 的前缀和,m = m - lowbit(m) 代表不断...

    Michael阿明
  • 经典笔试题-try{}里有一个return语句,那么紧跟在这个try后的finally{}里德code会不会被执行?什么时候被执行,在return之前还是

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • c++之函数

    绝命生
  • 查找二叉树

    【问题描述】 已知一棵二叉树用邻接表结构存储,中序查找二叉树中值为x的结点,并指出是第几个结点。例:如图二叉树的数据文件的数据格式如下 7 15 5 2 3 1...

    attack
  • 直方图实现快速中值滤波

    中值滤波能够有效去除图像中的异常点,具有去除图像噪声的作用。传统中值滤波的算法一般都是在图像中建立窗口,然后对窗口内的所有像素值进行排序,选择排序后的中间值作为...

    一棹烟波
  • 7-1 二分查找 (20分)

    输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和...

    韩旭051

扫码关注云+社区

领取腾讯云代金券