C#获取堆栈信息,输出文件名、行号、函数名、列号等
2017-03-13 00:15
441 查看
命名空间: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提供了一系列系统组件来帮助我们获取项目堆栈信息用于定位和排查,以下代码将返回出错堆栈调用的各上一级方法,直到最终的调用者方法
执行以上代码效果(跟代码中的调用方法一致):
参考:
在线代码:http://ideone.com/34Q3Sk
博客园:
如何处理Windows Forms程序中未处理的异常
微软真是个十足的混蛋啊!让我们跟踪Exception到行把!(不明真相群众请入)
挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim
浅析StackTrace
MSDN StackTrace 类
来自为知笔记(Wiz)
使用StackTrace堆栈跟踪记录详细日志(可获取行号)
出处:http://www.cnblogs.com/huangtailang/p/4550177.html
得到相关信息:
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('-','>'); } }
执行以上代码效果(跟代码中的调用方法一致):
参考:
在线代码:http://ideone.com/34Q3Sk
博客园:
如何处理Windows Forms程序中未处理的异常
微软真是个十足的混蛋啊!让我们跟踪Exception到行把!(不明真相群众请入)
挖一挖C#中那些我们不常用的东西之系列(3)——StackTrace,Trim
浅析StackTrace
MSDN StackTrace 类
来自为知笔记(Wiz)
使用StackTrace堆栈跟踪记录详细日志(可获取行号)
出处:http://www.cnblogs.com/huangtailang/p/4550177.html
相关文章推荐
- c#获取当前代码运行的文件名、运行的函数名以及当前代码执行的行号
- c#输出文件名、行号、函数名、列号
- 程序日志中自动记录所在函数名、文件名、行号,并定向输出到一个日志文件
- 带文件名和行号的信息输出宏
- Python 中如何获取当前位置所在的文件名,函数名,以及行号
- C#中获取当前执行的函数名、代码行、源码文件名
- C++输出文件名、函数名、行号
- C语言程序获取或者打印当前语句所在的行号、当前源文件的文件名、程序编译的日期等信息(__LINE__、__FUNCTION__、__FILE__、__DATE__、__TIME__)
- c# 获取当前运行程序文件,函数,行号
- python 获取当前行号 函数名 文件名
- C# 调用外部程序,并获取输出和错误信息
- 带文件名和行号的信息输出宏
- c# API使用GetVolumeInformation函数获取硬盘信息
- c语言输出文件名函数名和行号
- iOS日志记录当前文件的堆栈、类名、函数名、行号及文件路径等信息
- 实验 4.3.4 获取 CPU 的当前信息 1. 用sscanf函数获取 CPU 当前信息,输出到屏幕上
- c语言日志封装-输出文件名、函数名、行号
- 【python系列】python 获取当前位置所在的文件名、函数名和行号
- Java获取文件名/类名/函数名/行号的方法
- ios-调试程序打印详细信息 文件名 函数名 行号