c# 获取当前运行程序文件,函数,行号

参考链接:https://blog.csdn.net/luxiaoyu_sdc/article/details/6758881

命名空间: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());
————————————————
版权声明:本文为CSDN博主「luxiaoyu_sdc」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/luxiaoyu_sdc/article/details/6758881

c# 方法调用链System.Diagnostics.StackTrace

参考链接:https://blog.csdn.net/joyhen/article/details/41725285

一般用下面的方法处理:

///


/// 获取调用链上的方法
///

/// 回朔深度
public static MethodBase GetCurrentMethod(int depth) {
try {
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
return st.GetFrame(depth).GetMethod();
} catch {
return null;
}
}
具体的调用回溯怎么理解请看下面的小demo:
static void Main(string[] args) {
method1();
Console.ReadKey();
}
static void method1() {
method2();
Console.ReadLine();
}
static void method2() {
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(true);
Console.WriteLine(st.GetFrame(2).GetMethod().Name.ToString());
Console.WriteLine(st.GetFrame(1).GetMethod().Name.ToString());
Console.WriteLine(st.GetFrame(0).GetMethod().Name.ToString());
}
输出结果:
C#查看当前运行程序代码信息 - 图1
————————————————
版权声明:本文为CSDN博主「joyhen」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/joyhen/article/details/41725285

获取出错时的堆栈调用方法列表

参考链接:https://www.cnblogs.com/huangtailang/p/4550177.html

在使用.NET编写的代码在debug时很容易进行排查和定位问题,一旦项目上线并出现问题的话那么只能依靠系统日志来进行问题排查和定位,但当项目复杂时,即各种方法间相互调用将导致要获取具体的出错方法或调用者将是一件不那么容易的事(因为没有PDB文件)
还好.NET提供了一系列系统组件来帮助我们获取项目堆栈信息用于定位和排查,以下代码将返回出错堆栈调用的各上一级方法,直到最终的调用者方法

  1. /******************************************************************
  2. * 创建人:HTL
  3. * 创建时间:2015-06-03 19:54:49
  4. * 说明: 获取出错时的堆栈调用方法列表
  5. * Huangyuan413026@163.com
  6. *******************************************************************/
  7. using System;
  8. public class StackTraceTest
  9. {
  10. public static void Main()
  11. {
  12. m1();
  13. }
  14. static void m1(){
  15. m2();
  16. }
  17. static void m2(){
  18. m3();
  19. }
  20. static void m3(){
  21. ResponseWrite();
  22. }
  23. static void ResponseWrite(){
  24. ResponseWriteError();
  25. }
  26. static void ResponseWriteError(){
  27. //将错误信息写入日志
  28. Console.WriteLine(GetStackTraceModelName());
  29. }
  30. /// <summary>
  31. /// @Author: HTL
  32. /// @Email: Huangyuan413026@163.com
  33. /// @DateTime: 2015-06-03 19:54:49
  34. /// @Description: 获取当前堆栈的上级调用方法列表,直到最终调用者,只会返回调用的各方法,而不会返回具体的出错行数,可参考:微软真是个十足的混蛋啊!让我们跟踪Exception到行把!(不明真相群众请入)
  35. /// </summary>
  36. /// <returns></returns>
  37. static string GetStackTraceModelName()
  38. {
  39. //当前堆栈信息
  40. System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
  41. System.Diagnostics.StackFrame[] sfs = st.GetFrames();
  42. //过虑的方法名称,以下方法将不会出现在返回的方法调用列表中
  43. string _filterdName = "ResponseWrite,ResponseWriteError,";
  44. string _fullName = string.Empty, _methodName = string.Empty;
  45. for (int i = 1; i < sfs.Length; ++i)
  46. {
  47. //非用户代码,系统方法及后面的都是系统调用,不获取用户代码调用结束
  48. if (System.Diagnostics.StackFrame.OFFSET_UNKNOWN == sfs[i].GetILOffset()) break;
  49. _methodName = sfs[i].GetMethod().Name;//方法名称
  50. //sfs[i].GetFileLineNumber();//没有PDB文件的情况下将始终返回0
  51. if (_filterdName.Contains(_methodName)) continue;
  52. _fullName = _methodName + "()->" + _fullName;
  53. }
  54. st = null;
  55. sfs = null;
  56. _filterdName = _methodName = null;
  57. return _fullName.TrimEnd('-','>');
  58. }
  59. }

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

C#查看当前运行程序代码信息 - 图2

参考:
在线代码:http://ideone.com/34Q3Sk