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 點擊乘坐直達列車

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM