C#使用StackTrace获取方法被谁调用

在方法中扔进这段

System.Diagnostics.Debug.WriteLine(new string(‘*‘, 78));
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
System.Diagnostics.StackFrame[] sfs = st.GetFrames();
for (int u = 0; u < sfs.Length; ++u)
{
   System.Reflection.MethodBase mb = sfs[u].GetMethod();
    System.Diagnostics.Debug.WriteLine("[CALL STACK][{0}]: {1}.{2}", u, mb.DeclaringType.FullName, mb.Name);
}

然后就能在output窗口(Alt+2)看到类似

******************************************************************************
[CALL STACK][0]: WindowsFormsApplication1.Form1.button1_Click
[CALL STACK][1]: System.Windows.Forms.Button.OnMouseUp
[CALL STACK][2]: System.Windows.Forms.Control.WmMouseUp
[CALL STACK][3]: System.Windows.Forms.Control.WndProc
[CALL STACK][4]: System.Windows.Forms.ButtonBase.WndProc
[CALL STACK][5]: System.Windows.Forms.Button.WndProc
[CALL STACK][6]: System.Windows.Forms.NativeWindow.DebuggableCallback
[CALL STACK][7]: System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW
[CALL STACK][8]: System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW
[CALL STACK][9]: System.Windows.Forms.Application+ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop
[CALL STACK][10]: System.Windows.Forms.Application+ThreadContext.RunMessageLoopInner
[CALL STACK][11]: System.Windows.Forms.Application+ThreadContext.RunMessageLoop
[CALL STACK][12]: WindowsFormsApplication1.Program.Main
[CALL STACK][13]: System.AppDomain._nExecuteAssembly
[CALL STACK][14]: Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly
[CALL STACK][15]: System.Threading.ExecutionContext.RunInternal
[CALL STACK][16]: System.Threading.ExecutionContext.Run
[CALL STACK][17]: System.Threading.ExecutionContext.Run
[CALL STACK][18]: System.Threading.ThreadHelper.ThreadStart

再高(dan)级(teng)一点 ,写个公用的静态方法,并用上“DEBUG”条件之,然后……在需要的地方调用之

[System.Diagnostics.Conditional("DEBUG")]
static public void OutputCallStack()
{
    System.Diagnostics.Debug.WriteLine(new string(‘*‘, 78));
    System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace();
    System.Diagnostics.StackFrame[] sfs = st.GetFrames();
    for (int u = 1; u < sfs.Length; ++u)
    {
System.Reflection.MethodBase mb = sfs[u].GetMethod();
System.Diagnostics.Debug.WriteLine("[CALL STACK][{0}]: {1}.{2}", u, mb.DeclaringType.FullName, mb.Name);
    }
}

思考题:能否利用扩展方法扩展到Debug命名空间下呢?

另:西加加得到调用堆栈的东东都在execinfo.h 点击乘坐直达列车

时间: 2024-11-13 09:47:10

C#使用StackTrace获取方法被谁调用的相关文章

【转】StackTraceElement获取方法调用栈的信息

本文链接:https://blog.csdn.net/hp910315/article/details/52702199 一.什么是StackTrace StackTrace(堆栈轨迹)存放的就是方法调用栈的信息,异常处理中常用的printStackTrace()实质就是打印异常调用的堆栈信息. 二.StackTraceElement介绍 StackTraceElement表示StackTrace(堆栈轨迹)中的一个方法对象,属性包括方法的类名.方法名.文件名以及调用的行数. public fi

原 .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)

大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能:这些问题却没有统一的描述. 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议.为了解决反射的性能问题,你可以遵循本文采用的各种方案. 本文内容 反射各方法的性能数据 反射的高性能开发建议 创建类型的实例 反射获取 Attribute 反射调用公共 / 私有方法 使用预编译框架 附本文性能测试所用的代码 所有反射相关方法 IsDefined 和 GetCustomAttribute 的专项比较 参考资料 反

c#图像处理入门(-bitmap类和图像像素值获取方法)

c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义的图像的对象.该类的主要方法和属性如下: 1. GetPixel方法和SetPixel方法:获取和设置一个图像的指定像素的颜色. 2. PixelFormat属性:返回图像的像素格式. 3. Palette属性:获取和设置图像所使用的颜色调色板. 4. Height Width属性:返回图像的高度和

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法

JAVA反射系列之Field,java.lang.reflect.Field使用获取方法.   转载https://my.oschina.net/u/1407116/blog/209383 摘要 java.lang.reflect.Field使用 Field. 首先必须明一点 Field类主要是用来辅助获取和操作类的属性的! 1.怎么通过反射获取类的属性 先来看JDK提供的方法有如下几种: a)Class.getDeclaredField(String name);      返回一个 Fiel

java:struts框架2(方法的动态和静态调用)

1.方法的静态和动态调用: struts.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">

Spring中@Async注解实现“方法”的异步调用

简单介绍: Spring为任务调度与异步方法执行提供了注解支持.通过在方法上设置@Async注解,可使得方法被异步调用.也就是说调用者会在调用时立即返回,而被调用方法的实际执行是交给Spring的TaskExecutor来完成. 开启@Async注解: <task:annotation-driven executor="annotationExecutor" /> <!-- 支持 @Async 注解 --> <task:executor id="

JAVA获取方法参数名的分析(一)

关于题目 首先解释一下题目. 我们知道, Java通过反射,可以从一个类得知它有哪些方法,有哪些变量,也可以知道每个方法中有哪几个什么类型的传入参数.但有一个东西反射取不到,那就是我们对方法传入参数的命名. 取得传入参数的名字有什么意义? 对这个问题的探究,源于在写一个测试类时候的需求.假设我们有一个类需要测试,这个类中有数十个方法.为每个方法编写测试类,将耗费大量的时间和精力.因此我有一种想法,就是通过java的反射,获得这个类所有的方法,再通过传入参数的名字和参数类型,来生成一些符合要求的数

js调用.net后台事件,和后台调用前台等方法以及js调用服务器控件的方法

http://blog.csdn.net/deepwishly/article/details/6670942  ajaxPro.dll基础教程(前台调用后台方法,后台调用前台方法) 1. javaScript函数中执行C#代码中的函数: 方法一:间接触发后台代码 1.首先建立一个服务端控件按钮命名为btn1,双击进入后台将调用或处理的内容写入btn1_click中; 2.在前台写一个js函数,内容为document.getElementByIdx("btn1").click(); 3

TimerTask的run()方法里面如何调用service层里面的方法

在java的spring框架中,用Timer和TimerTask来实现定时任务,有时我们要在TimerTask的子类的重写run方法里,调用service层的方法. 但是不管是spring.xml配置的bean还是注解@autoware注入的bean,在执行的时候都会报空指针异常. 这其中主要的问题是TimerTask不是由spring管理的,所以你TimerTask内部的service也无法自动注入,2种解决办法,1.TimerTask交由spring管理:2.通过applicationCon