zoukankan      html  css  js  c++  java
  • 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 点击乘坐直达列车

  • 相关阅读:
    阿里云Centos7安装和启动nginx
    mysql安装配置、主从复制配置详解
    php 文件大小计算转换
    tp5.0 生成二维码 + 合并海报图
    iTerm2 + Oh My Zsh
    linux 安装 卸载 命令
    php两个时间日期相隔的天数,时,分,秒.
    PhpStorm下载 + 破解
    php 地区三级联动
    PhpSpreadsheet 引入类库 导出 excel
  • 原文地址:https://www.cnblogs.com/mumuliang/p/3939143.html
Copyright © 2011-2022 走看看