.NET使用StackTrace获取方法调用信息的代码演示

 更新时间:2022年09月04日 07:47:57   作者:人生短短几个秋  
StackTrace, 位于 System.Diagnostics 命名空间下,名字很直观,它代表一个方法调用的跟踪堆栈,里面存放着按顺序排列的栈帧对象(StackFrame),每当发生一次调用,就会压入一个栈帧,这篇文章主要介绍了.NET使用StackTrace获取方法调用信息,需要的朋友可以参考下

前言

在日常工作中,偶尔需要调查一些诡异的问题,而业务代码经过长时间的演化,很可能已经变得错综复杂,流程、分支众多,如果能在关键方法的日志里添加上调用者的信息,将对定位问题非常有帮助。

介绍

StackTrace, 位于 System.Diagnostics 命名空间下,名字很直观,它代表一个方法调用的跟踪堆栈,里面存放着按顺序排列的栈帧对象(StackFrame),每当发生一次调用,就会压入一个栈帧;而一个栈帧,则拥有本次调用的各种信息,除了MethodBase,还包括所在的文件名、行、列等。

演示

下面代码演示了如何获取调用者的方法名、所在文件、行号、列号等信息。

public static string GetCaller()
{
       StackTrace st = new StackTrace(skipFrames: 1, fNeedFileInfo: true);
       StackFrame[] sfArray = st.GetFrames();
 
       return string.Join(" -> ",
            sfArray.Select(r =>
                $"{r.GetMethod().Name} in {r.GetFileName()} line:{r.GetFileLineNumber()} column:{r.GetFileColumnNumber()}"));
    
}

第一帧是 GetCaller本身,所以跳过;fNeedFileInfo设置成 true,否则调用者所在文件等信息会为空。
简单创建个控制台程序并添加几个类模拟一下,输出如下:

UpdateOrder in G:\examples\MethodCall2\ClassLevel6.cs line:11 column:8 -> 
Level5Method in G:\examples\MethodCall2\ClassLevel5.cs line:8 column:9 -> 
Level4Method in G:\examples\MethodCall2\ClassLevel4.cs line:10 column:9 -> 
Level3Method in G:\examples\MethodCall2\ClassLevel3.cs line:10 column:9 -> 
Level2Method in G:\examples\MethodCall2\ClassLevel2.cs line:10 column:9 -> 
InternalMethod in G:\examples\MethodCall2\ClassLevel1.cs line:12 column:13 -> 
Main in G:\examples\MethodCall2\Program.cs line:18 column:17

可以看到因为StackTrace是个栈结构(FILO),所以打印出来的顺序也是由近及远的。

链接

StackTrace Class https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stacktrace?view=net-6.0

StackFrame Class https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.stackframe?view=net-6.0

到此这篇关于.NET使用StackTrace获取方法调用信息的文章就介绍到这了,更多相关.NET方法调用信息内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Asp.net SignalR创建实时聊天应用程序

    Asp.net SignalR创建实时聊天应用程序

    这篇文章主要介绍了Asp.net SignalR创建实时聊天应用程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • C#中使用SQLite数据库的方法介绍

    C#中使用SQLite数据库的方法介绍

    SQLite是一个开源的轻量级的桌面型数据库,它将几乎所有数据库要素(包括定义、表、索引和数据本身)都保存在一个单一的文件中。SQLite用C编写实现,它在内存消耗、文件体积、操作性能、简单性方面都有不错的表现
    2012-01-01
  • Asp.NET Core 如何调用WebService的方法

    Asp.NET Core 如何调用WebService的方法

    这篇文章主要介绍了Asp.NET Core 如何调用WebService的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • asp.net core3.1 引用的元包dll版本兼容性问题解决方案

    asp.net core3.1 引用的元包dll版本兼容性问题解决方案

    这篇文章主要介绍了asp.net core 3.1 引用的元包dll版本兼容性问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-03-03
  • CHECKBOX 的全选、取消及跨页保存的实现方法

    CHECKBOX 的全选、取消及跨页保存的实现方法

    CHECKBOX的操作在页面中很常见,比如全选、取消、跨页保存等等,下面有个不错的示例,大家可以尝试操作下
    2013-10-10
  • C# 进制转换的实现(二进制、十六进制、十进制互转)

    C# 进制转换的实现(二进制、十六进制、十进制互转)

    这篇文章主要介绍了C# 进制转换的实现(二进制、十六进制、十进制互转),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • .net6简单使用NPOI读取Excel的项目实践

    .net6简单使用NPOI读取Excel的项目实践

    本文主要介绍了.net6简单使用NPOI读取Excel的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C# SetCursorPos简介及使用说明

    C# SetCursorPos简介及使用说明

    该函数把光标移到屏幕的指定位置,如果新位置不在由ClipCursor函数设置的屏幕矩形区域之内,则系统自动调整坐标,使得光标在矩形之内
    2012-12-12
  • ASP.NET实现推送文件到浏览器的方法

    ASP.NET实现推送文件到浏览器的方法

    这篇文章主要介绍了ASP.NET实现推送文件到浏览器的方法,可实现将文件推送到浏览器供用户浏览或下载的功能,需要的朋友可以参考下
    2015-06-06
  • datagrid绑定list没有数据 表头不显示的解决方法

    datagrid绑定list没有数据 表头不显示的解决方法

    datagrid绑定list没有数据 表头不显示的问题,那是因为 绑定了null,你给list new一下就好 表头就会有啦
    2013-05-05

最新评论