次の方法で共有


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

参照

概念

MFC マクロとグローバル

参照

afxDump (MFC の CDumpContext)