C#获取当前堆栈的各调用方法列表
2015-06-03 20:29
489 查看
在使用.NET编写的代码在debug时很容易进行排查和定位问题,一旦项目上线并出现问题的话那么只能依靠系统日志来进行问题排查和定位,但当项目复杂时,即各种方法间相互调用将导致要获取具体的出错方法或调用者将是一件不那么容易的事(因为没有PDB文件)
还好.NET提供了一系列系统组件来帮助我们获取项目堆栈信息用于定位和排查,以下代码将返回出错堆栈调用的各上一级方法,直到最终的调用者方法
执行以上代码效果(跟代码中的调用方法一致):
参考:
在线代码:http://ideone.com/34Q3Sk
博客园:
如何处理Windows Forms程序中未处理的异常
微软真是个十足的混蛋啊!让我们跟踪Exception到行把!(不明真相群众请入)
挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim
浅析StackTrace
MSDN StackTrace 类
来自为知笔记(Wiz)
还好.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('-','>'); } }
执行以上代码效果(跟代码中的调用方法一致):
参考:
在线代码:http://ideone.com/34Q3Sk
博客园:
如何处理Windows Forms程序中未处理的异常
微软真是个十足的混蛋啊!让我们跟踪Exception到行把!(不明真相群众请入)
挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim
浅析StackTrace
MSDN StackTrace 类
来自为知笔记(Wiz)
相关文章推荐
- C#中汉字排序简单示例(拼音/笔划)
- C# string byte[] Base64 常用互相转换
- C#实现windows form拷贝内容到剪贴板的方法
- C# 下实现UPD编程Demo
- 【C#】读书笔记
- C# Task的使用---Task的启动
- C#设计模式(1)——单例模式
- Random 类
- C#控制台输出菱形
- .net c# outlook发送邀请功
- log4net的简单应用
- C# DataSet的基本用法
- C# @符号的作用, 可定义关键字为变量名
- C#学习笔记(一)
- C#如何保存剪贴板内容,在使用后恢复。
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 几十套业务系统集中统一授权管理实现经验分享
- c# 保留2位小数
- 《C#程序设计》 第五次作业:开源项目“网页正文提取”的理解
- C# List和String互相转换
- C# 基础中有关术语理解