C#获取堆栈信息,输出文件名、行号、函数名、列号等

命名空间:System.Diagnostics

得到相关信息:

StackTrace st = new StackTrace(new StackFrame(true));
StackFrame sf = st.GetFrame(0);
Console.WriteLine(" File: {0}", sf.GetFileName());                                                //文件名
Console.WriteLine(" Method: {0}", sf.GetMethod().Name);                                 //函数名
Console.WriteLine(" Line Number: {0}", sf.GetFileLineNumber());                  //文件行号
Console.WriteLine(" Column Number: {0}", sf.GetFileColumnNumber());

 

写日志,便于调试,查找问题

StackTrace st = new StackTrace(new StackFrame(true));只能获取本次的堆栈信息,可以改用下面的方法获取程序的调用堆栈信息。

StackTrace st = new StackTrace(true); 就可以获取程序的整个堆栈调用关系的列表信息。

使用st.ToString()可以直接获取堆栈列表,是不是很方便啊。

 

参考:http://blog.csdn.net/zhuxiaowei716/article/details/46337033

================================================================================================

在使用.NET编写的代码在debug时很容易进行排查和定位问题,一旦项目上线并出现问题的话那么只能依靠系统日志来进行问题排查和定位,但当项目复杂时,即各种方法间相互调用将导致要获取具体的出错方法或调用者将是一件不那么容易的事(因为没有PDB文件)
还好.NET提供了一系列系统组件来帮助我们获取项目堆栈信息用于定位和排查,以下代码将返回出错堆栈调用的各上一级方法,直到最终的调用者方法
复制代码
复制代码
/******************************************************************
 * 创建人:HTL
 * 创建时间:2015-06-03 19:54:49
 * 说明: 获取出错时的堆栈调用方法列表
 * Huangyuan413026@163.com
 *******************************************************************/
using System;
 
public class StackTraceTest
{
    public static void Main()
    {
        m1();
    }
    static void m1(){
        m2();
    }
 
    static void m2(){
        m3();
    }
 
    static void m3(){
        ResponseWrite();
    }
    static void ResponseWrite(){
        ResponseWriteError();
    }
    static void ResponseWriteError(){
        //将错误信息写入日志
        Console.WriteLine(GetStackTraceModelName());        
    }
    /// <summary>
    /// @Author:      HTL
    /// @Email:       Huangyuan413026@163.com
    /// @DateTime:    2015-06-03 19:54:49
    /// @Description: 获取当前堆栈的上级调用方法列表,直到最终调用者,只会返回调用的各方法,而不会返回具体的出错行数,可参考:微软真是个十足的混蛋啊!让我们跟踪Exception到行把!(不明真相群众请入) 
    /// </summary>
    /// <returns></returns>
    static string GetStackTraceModelName()
    {
        //当前堆栈信息
        System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
        System.Diagnostics.StackFrame[] sfs = st.GetFrames();
        //过虑的方法名称,以下方法将不会出现在返回的方法调用列表中
        string _filterdName = "ResponseWrite,ResponseWriteError,";
        string _fullName = string.Empty, _methodName = string.Empty;
        for (int i = 1; i < sfs.Length; ++i)
        {
            //非用户代码,系统方法及后面的都是系统调用,不获取用户代码调用结束
            if (System.Diagnostics.StackFrame.OFFSET_UNKNOWN == sfs[i].GetILOffset()) break;
            _methodName = sfs[i].GetMethod().Name;//方法名称
            //sfs[i].GetFileLineNumber();//没有PDB文件的情况下将始终返回0
            if (_filterdName.Contains(_methodName)) continue;
            _fullName = _methodName + "()->" + _fullName;
        }
        st = null;
        sfs = null;
        _filterdName = _methodName = null;
        return _fullName.TrimEnd('-','>');
    }
}
复制代码
复制代码

 

 
执行以上代码效果(跟代码中的调用方法一致):
 
 
参考:
 
博客园:
 
 

使用StackTrace堆栈跟踪记录详细日志(可获取行号)



出处:http://www.cnblogs.com/huangtailang/p/4550177.html

posted on   jack_Meng  阅读(14112)  评论(0编辑  收藏  举报

编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2015-03-13 学习动态性能表(22)V$resource_limit
2015-03-13 学习动态性能表(21)v$lincense
2015-03-13 学习动态性能表(20)--v$waitstat
2015-03-13 学习动态性能表(19)--v$undostat
2015-03-13 学习动态性能表(18)--v$system_event
2015-03-13 学习动态性能表(17)--v$segstat&v$segment_statistics
2015-03-13 学习动态性能表(16)--v$rowcache

导航

< 2025年3月 >
23 24 25 26 27 28 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 1 2 3 4 5
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏

主题色彩