AfxDumpStack
更新 : 2007 年 11 月
このグローバル関数を使用して、現在のスタックのイメージを生成できます。
void AFXAPI AfxDumpStack(
DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT
);
パラメータ
dwTarget
ダンプ出力先のターゲットを指定します。ビットごとの OR 演算子 (|) を使って組み合わせることができる値は次のとおりです。AFX_STACK_DUMP_TARGET_TRACE TRACE マクロを使って出力を送ります。TRACE マクロは、デバッグ ビルドにのみ出力します。リリース ビルドには出力しません。また、TRACE は、デバッガ以外のターゲットにもリダイレクトできます。
AFX_STACK_DUMP_TARGET_DEFAULT ダンプ出力を既定のターゲットに送ります。デバッグ ビルドでは、出力が TRACE マクロに送られます。リリース ビルドでは、出力がクリップボードに送られます。
AFX_STACK_DUMP_TARGET_CLIPBOARD 出力をクリップボードだけに送ります。このデータは、CF_TEXT クリップボード フォーマットの書式なしテキストとして、クリップボードに格納されます。
AFX_STACK_DUMP_TARGET_BOTH 出力をクリップボードと TRACE マクロに同時に送ります。
AFX_STACK_DUMP_TARGET_ODS Win32 関数 OutputDebugString() を使って出力をデバッガに直接送ります。デバッガがプロセスにアタッチされている場合は、デバッグ ビルドとリリース ビルドの両方でデバッガ出力が生成されます。デバッガがアタッチされている場合は、必ずデバッガに出力が送られます。リダイレクトは行うことができません。
解説
次の例は、MFC ダイアログ アプリケーションのボタン ハンドラから AfxDumpStack を呼び出して生成された 1 行の出力です。
=== begin AfxDumpStack output ===
00427D55: DUMP2\DEBUG\DUMP2.EXE! void AfxDumpStack(unsigned long) + 181 bytes
0040160B: DUMP2\DEBUG\DUMP2.EXE! void CDump2Dlg::OnClipboard(void) + 14 bytes
0044F884: DUMP2\DEBUG\DUMP2.EXE! int _AfxDispatchCmdMsg(class CCmdTarget *,
unsigned int,int,void ( CCmdTarget::*)(void),void *,unsigned int,struct AFX_CMDHANDLE
0044FF7B: DUMP2\DEBUG\DUMP2.EXE! virtual int CCmdTarget::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 626 bytes
00450C71: DUMP2\DEBUG\DUMP2.EXE! virtual int CDialog::OnCmdMsg(unsigned
int,int,void *,struct AFX_CMDHANDLERINFO *) + 36 bytes
00455B27: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnCommand(unsigned
int,long) + 312 bytes
00454D3D: DUMP2\DEBUG\DUMP2.EXE! virtual int CWnd::OnWndMsg(unsigned
int,unsigned int,long,long *) + 83 bytes
00454CC0: DUMP2\DEBUG\DUMP2.EXE! virtual long CWnd::WindowProc(unsigned
int,unsigned int,long) + 46 bytes
004528D9: DUMP2\DEBUG\DUMP2.EXE! long AfxCallWndProc(class CWnd *,struct
HWND__ *,unsigned int,unsigned int,long) + 237 bytes
00452D34: DUMP2\DEBUG\DUMP2.EXE! long AfxWndProc(struct HWND__ *,unsigned
int,unsigned int,long) + 129 bytes
BFF73663: WINDOWS\SYSTEM\KERNEL32.DLL! ThunkConnect32 + 2148 bytes
BFF928E0: WINDOWS\SYSTEM\KERNEL32.DLL! UTUnRegister + 2492 bytes
=== end AfxDumpStack() output ===
上記出力の各行は、最後の関数呼び出しのアドレス、関数呼び出しを含むモジュールの完全パス名、および呼び出された関数プロトタイプを示します。スタックでの関数呼び出しが関数の指定したアドレスで発生しない場合は、バイト単位のオフセットが表示されます。
例として、次の表で上記出力の最初の行を説明します。
出力 |
説明 |
---|---|
00427D55: |
最後の関数呼び出しの戻りアドレス。 |
DUMP2\DEBUG\DUMP2.EXE! |
関数呼び出しを行ったモジュールの完全パス名。 |
void AfxDumpStack(unsigned long) |
呼び出された関数プロトタイプ。 |
+ 181 bytes |
関数プロトタイプのアドレス (この場合、void AfxDumpStack(unsigned long)) から戻りアドレス (この場合、00427D55) へのバイト単位のオフセット。 |
AfxDumpStack は、MFC ライブラリのデバッグ バージョンでも非デバッグ バージョンでも有効です。実行ファイルで共有 DLL の MFC を使用していても、この関数は常に静的にリンクされます。共有ライブラリ実装では、この関数は MFCS42.LIB ライブラリ (およびその拡張バージョン) にあります。
この関数を使用するときは、以下の条件を満たす必要があります。
IMAGEHLP.DLL ファイルを PATH で指定されている場所に置きます。この DLL がない場合は、エラー メッセージが表示されます。IMAGEHLP が提供する関数のセットについては、「Image Help Library」を参照してください。
スタック上にフレームを持つモジュールは、デバッグ情報をインクルードする必要があります。モジュールにデバッグ情報がなくても、この関数はスタック トレースを生成しますが、詳細なトレースは生成されません。
必要条件
ヘッダー : afx.h