在使用.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 = ; 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('-','>');
}
}
 
执行以上代码效果(跟代码中的调用方法一致):
 
 
参考:
 
博客园:
 
 

最新文章

  1. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
  2. Python_Day4_函数
  3. 002. Centos7安装mysql5.5.37
  4. Redis配置以及通过C#访问小试
  5. rsync 目录 斜杠
  6. js与C#服务端 json数据交互
  7. css图片映射
  8. bzoj3156
  9. CSS实现DIV三角形
  10. RollPagerView的用法:
  11. android避免decodeResource图片时占用太大的内存
  12. IE6下的怪异解析知识点补充
  13. configure PUTTY to not time out
  14. win32使用ATL显示C#COM窗体
  15. [uva11992]Fast Matrix Operations(多延迟标记,二维线段树,区间更新)
  16. “HK”的日常之ARP断网攻击
  17. Hackers&#39; Crackdown UVA - 11825 (状压dp)
  18. HTTP1.0 、1.1
  19. ASP.NET Identity详解
  20. Ubuntu16.10下使用VSCode开发.netcore

热门文章

  1. fedora添加ntfs文件系统支持
  2. python基本数据类型 数字 和 字符串
  3. nginx1.14的安装
  4. java连接zookeeper服务器出现“KeeperErrorCode = ConnectionLoss for ...”
  5. 个人技术博客--团队Git规范(参考西瓜学长)
  6. 17秋 软件工程 第六次作业 Beta冲刺 Scrum2
  7. [转]mysql和redis的区别
  8. PHP的运行机制与原理(底层)
  9. dns与wins的区别
  10. 第一行代码 -3-1 软件也要拼脸蛋-UI界面