プログラム途中で呼び出し履歴、スタックトレースをとる方法
2005/07/18
この文書はVisual Studio 2003.NET製品版時点をベースに記述されています。
プログラム途中で呼び出し履歴、スタックトレースをとる方法
System.Diagnostics.StackTrace st = new System.Diagnostics.StackTrace(); for( int StackLoop = 0; StackLoop < st.FrameCount; StackLoop++) { System.Diagnostics.StackFrame sf = st.GetFrame(StackLoop); System.Reflection.MethodBase mb = sf.GetMethod(); System.Diagnostics.Debug.WriteLine( sf.ToString() ); }
このようにStackTraceクラスを利用すれば取得することが可能です。
上記の出力例
Void XXXリストボックス_SelectedIndexChanged(System.Object, System.EventArgs) Void OnSelectedIndexChanged(System.EventArgs) Void set_SelectedIndex(Int32) Void RefreshItems() Void OnDataSourceChanged(System.EventArgs) Void SetDataConnection(System.Object, System.Windows.Forms.BindingMemberInfo, Boolean) Void set_DataSource(System.Object) Void XXXデータグリッド_Paint(System.Object, System.Windows.Forms.PaintEventArgs) Void OnPaint(System.Windows.Forms.PaintEventArgs) Void OnPaint(System.Windows.Forms.PaintEventArgs) Void PaintWithErrorHandling(System.Windows.Forms.PaintEventArgs, Int16, Boolean) Void WmPaint(System.Windows.Forms.Message ByRef) Void WndProc(System.Windows.Forms.Message ByRef) Void OnMessage(System.Windows.Forms.Message ByRef) Void WndProc(System.Windows.Forms.Message ByRef) IntPtr DebuggableCallback(IntPtr, Int32, IntPtr, IntPtr) IntPtr DispatchMessageW(MSG ByRef) Boolean System.Windows.Forms.UnsafeNativeMethods+IMsoComponentManager.FPushMessageLoop(Int32, Int32, Int32) Void RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext) Void RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext) Void RunDialog(System.Windows.Forms.Form) System.Windows.Forms.DialogResult ShowDialog(System.Windows.Forms.IWin32Window) System.Windows.Forms.DialogResult ShowDialog() Void XXXの取り込みボタン_Click(System.Object, System.EventArgs) Void OnClick(System.EventArgs) Void OnClick(System.EventArgs) Void PerformClick() Boolean ProcessMnemonic(Char) Boolean _ProcessMnemonic(Char) Boolean ProcessMnemonic(Char) Boolean ProcessDialogChar(Char) Boolean ProcessDialogChar(Char) Boolean ProcessDialogChar(Char) Boolean PreProcessMessage(System.Windows.Forms.Message ByRef) Boolean System.Windows.Forms.UnsafeNativeMethods+IMsoComponent.FPreTranslateMessage(MSG ByRef) Boolean System.Windows.Forms.UnsafeNativeMethods+IMsoComponentManager.FPushMessageLoop(Int32, Int32, Int32) Void RunMessageLoopInner(Int32, System.Windows.Forms.ApplicationContext) Void RunMessageLoop(Int32, System.Windows.Forms.ApplicationContext) Void Run(System.Windows.Forms.Form) Void Main()
例外のスタックトレースとは表示している内容が違います。
このあたりは編集をこまごまとすることにより可能です。いろいろやってみてください。
デバッグビルド時にしか取得はできませんので、注意してください。