[C#] 在 C# 中获取函数的调用栈数据(方便日志打印(获取文件名、行号、函数名))

陪她去流浪 桃子 2017年08月20日 编辑 阅读次数:5140

在 C# 中获取当前函数的调用栈帧信息需要用到一个叫 StackTrace 的类和一个叫 StackFrame。前者记录了当前调用栈跟踪数据,后者表示一个栈帧。

简单地说,假设有A->B->C的调用链,其表示 A 调用 B,B 调用 C。那么 A、B、C 三者这一层调用关系链即叫作栈跟踪(StackTrace),而它们其中之一则叫作一个栈帧(StackFrame)

以下的代码简单地介绍了如何在 C# 中使用这两个类来获取当前的函数调用信息:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
using System;
using System.Diagnostics;

namespace TestStackTrace
{
    class Program
    {
        public static void TraceStack()
        {
            // 0 表示要忽略的帧数
            // true 表示需要文件信息
            var stack = new StackTrace(0, true);

            for (int i = 0; i < stack.FrameCount; i++) {
                var frame = stack.GetFrame(i);
                var trace = ""
                    + "文件:" + frame.GetFileName()
                    + "\n函数:" + frame.GetMethod().Name
                    + "\n行号:" + frame.GetFileLineNumber()
                    + "\n"
                    ;
                Console.WriteLine(trace);
            }
        }

        public void MyMethod()
        {
            TraceStack();
        }

        static void Main(string[] args)
        {
            var program = new Program();
            program.MyMethod();
        }
    }
}

以下是示例输出:

文件:c:\Users\admin\Desktop\StackTrace\Program.cs
函数:TraceStack
行号:10

文件:c:\Users\admin\Desktop\StackTrace\Program.cs
函数:MyMethod
行号:26

文件:c:\Users\admin\Desktop\StackTrace\Program.cs
函数:Main
行号:32

-----------------------------------------------------------

文件:c:\Users\admin\Desktop\StackTrace\Program.cs
函数:TraceStack
行号:14

文件:c:\Users\admin\Desktop\StackTrace\Program.cs
函数:Main
行号:35

-----------------------------------------------------------

文件:
函数:TraceStack
行号:0

文件:
函数:Main
行号:0

一共3部分。第1部分是 Debug 版本的输出;第2部分是 Release(带PDB) 版本的输出;第3部分是 Release(不带PDB) 版本的输出。