次の方法で共有


IDiaFrameData

スタック フレームの詳細を公開します。

構文

IDiaFrameData : IUnknown

Vtable 順序のメソッド

次の表に、IDiaFrameData のメソッドを示します。

メソッド 説明
IDiaFrameData::get_addressSection フレームのコード アドレスのセクション部分を取得します。
IDiaFrameData::get_addressOffset フレームのコード アドレスのオフセット部分を取得します。
IDiaFrameData::get_relativeVirtualAddress フレームのコードのイメージ相対仮想アドレス (RVA) を取得します。
IDiaFrameData::get_virtualAddress フレームのコードの仮想アドレス (VA) を取得します。
IDiaFrameData::get_lengthBlock フレームで記述されているコードのブロックの長さ (バイト単位) を取得します。
IDiaFrameData::get_lengthLocals スタックにプッシュされたローカル変数のバイト数を取得します。
IDiaFrameData::get_lengthParams スタックにプッシュされたパラメーターのバイト数を取得します。
IDiaFrameData::get_maxStack フレーム内のスタックにプッシュされた最大バイト数を取得します。
IDiaFrameData::get_lengthProlog ブロック内のプロローグ コードのバイト数を取得します。
IDiaFrameData::get_lengthSavedRegisters スタックにプッシュされた、保存されたレジスタのバイト数を取得します。
IDiaFrameData::get_program 現在の関数の呼び出しの前にレジスタ セットを計算するために使用されるプログラム文字列を取得します。
IDiaFrameData::get_systemExceptionHandling システム例外処理が有効であることを示すフラグを取得します。
IDiaFrameData::get_cplusplusExceptionHandling C++ 例外処理が有効であることを示すフラグを取得します。
IDiaFrameData::get_functionStart ブロックに関数のエントリ ポイントが含まれていることを示すフラグを取得します。
IDiaFrameData::get_allocatesBasePointer このアドレス範囲にコードの基本ポインターが割り当てられていることを示すフラグを取得します。 このメソッドは非推奨です。
IDiaFrameData::get_type コンパイラ固有のフレームの種類を取得します。
IDiaFrameData::get_functionParent 外側の関数のフレーム データ インターフェイスを取得します。
IDiaFrameData::execute スタック アンワインドを実行し、スタック ウォーク フレーム インターフェイス内のレジスタの現在の状態を返します。

解説

フレームについて使用できる詳細は、アドレスとブロックの長さで示されるアドレス範囲内にある実行ポイントに関するものです。

呼び出し元に関する注意事項

このインターフェイスを取得するには、IDiaEnumFrameData::Next または IDiaEnumFrameData::Item メソッドを呼び出します。 詳細については、IDiaEnumFrameData インターフェイスを参照してください。

この例では、IDiaFrameData オブジェクトのプロパティを出力します。 IDiaFrameData インターフェイスの取得方法の例については、IDiaEnumFrameData インターフェイスを参照してください。

void PrintFrameData(IDiaFrameData* pFrameData){
    DWORD dwSect;
    DWORD dwOffset;
    DWORD cbBlock;
    DWORD cbLocals; // Number of bytes reserved for the function locals
    DWORD cbParams; // Number of bytes reserved for the function arguments
    DWORD cbMaxStack;
    DWORD cbProlog;
    DWORD cbSavedRegs;
    BOOL  bSEH;
    BOOL  bEH;
    BOOL  bStart;
    BSTR  wszProgram;

    if(pFrameData->get_addressSection(&dwSect) == S_OK &&
       pFrameData->get_addressOffset(&dwOffset) == S_OK &&
       pFrameData->get_lengthBlock(&cbBlock) == S_OK &&
       pFrameData->get_lengthLocals(&cbLocals) == S_OK &&
       pFrameData->get_lengthParams(&cbParams) == S_OK &&
       pFrameData->get_maxStack(&cbMaxStack) == S_OK &&
       pFrameData->get_lengthProlog(&cbProlog) == S_OK &&
       pFrameData->get_lengthSavedRegisters(&cbSavedRegs) == S_OK &&
       pFrameData->get_systemExceptionHandling(&bSEH) == S_OK &&
       pFrameData->get_cplusplusExceptionHandling(&bEH) == S_OK &&
       pFrameData->get_functionStart(&bStart) == S_OK )
    {
        wprintf(L"Frame address  : %04X:%08X\n", dwSect, dwOffset);
        wprintf(L"Block size     : 0x%8X\n", cbBlock);
        wprintf(L"Locals size    : 0x%8X\n", cbLocals);
        wprintf(L"Parms size     : 0x%8X\n", cbParams);
        wprintf(L"Max stack used : 0x%8X\n", cbMaxStack);
        wprintf(L"Prolog size    : 0x%8X\n", cbProlog);
        wprintf(L"Saved regs size: 0x%8X\n", cbSavedRegs);
        wprintf(L"System Exception Handling: %c\n", bSEH ? L'Y' : L'N');
        wprintf(L"C++ Exception Handling   : %c\n", bEH ? L'Y' : L'N');
        wprintf(L"Function starts in block : %c\n", bStart ? L'Y' : L'N');

        if (pFrameData->get_program(&wszProgram) == S_OK)
        {
            wprintf(L"Program used for register set: %s\n", wszProgram);
            SysFreeString(wszProgram);
        }
        else
        {
            wprintf(L"\n");
        }
    }
}

要件

ヘッダー: Dia2.h

ライブラリ: diaguids.lib

DLL: msdia80.dll

関連項目