IDebugControl3::ControlledOutputVaList メソッド (dbgeng.h)
ControlledOutputVaList メソッドは文字列を書式設定し、エンジンのクライアントの一部に登録された出力コールバックに結果を送信します。
構文
HRESULT ControlledOutputVaList(
[in] ULONG OutputControl,
[in] ULONG Mask,
[in] PCSTR Format,
[in] va_list Args
);
パラメーター
[in] OutputControl
出力を受信するクライアントの出力コールバックを決定する出力コントロールを指定します。 使用可能な値については、「 DEBUG_OUTCTL_XXX」を参照してください。 出力の詳細については、「 入力と出力」を参照してください。
[in] Mask
出力型のビット フィールドを指定します。 使用可能な値については 、「DEBUG_OUTPUT_XXX 」を参照してください。
[in] Format
printf のように書式指定文字列を指定します。 通常、変換文字は C の場合とまったく同じように機能します。浮動小数点変換文字の場合、 l 修飾子を使用しない限り、64 ビット引数は 32 ビット浮動小数点数として解釈されます。
%p 変換文字はサポートされていますが、ターゲットのアドレス空間内のポインターを表します。 修飾子がない可能性があり、デバッガーの内部アドレス形式が使用されます。 次の追加変換文字がサポートされています。
文字 | 引数の型 | 引数 | 印刷されたテキスト |
---|---|---|---|
%p | ULONG64 | アドレス空間内のポインター。 | ポインターの値。 |
%n | DWORD_PTR (ホストのアーキテクチャに応じて 32 ビットまたは 64 ビット) | ホストの仮想アドレス空間内のポインター。 | ポインターの値。 (これは標準の C %p 文字と同じです)。 |
%i | ULONG64 | 任意の 64 ビット値。 | 指定した値。 これが0xFFFFFFFFより大きい場合は、64 ビット値として出力されます。それ以外の場合は、32 ビット値として出力されます。 |
%ma | ULONG64 | プロセスの仮想アドレス空間内の NULL で終わる ASCII 文字列のアドレス。 | 指定された文字列。 |
%mu | ULONG64 | プロセスの仮想アドレス空間内の NULL で終わる Unicode 文字列のアドレス。 | 指定された文字列。 |
%msa | ULONG64 | プロセスの仮想アドレス空間内のANSI_STRING構造体のアドレス。 | 指定された文字列。 |
%msu | ULONG64 | プロセスの仮想アドレス空間内のUNICODE_STRING構造体のアドレス。 | 指定された文字列。 |
%y | ULONG64 | シンボル情報を含むアイテムのプロセスの仮想アドレス空間内のアドレス。 | 指定した記号の名前を含む文字列 (およびディスプレイスメントがある場合はディスプレイスメント)。 |
%ly | ULONG64 | シンボル情報を含むアイテムのプロセスの仮想アドレス空間内のアドレス。 | 指定したシンボルの名前 (およびディスプレイスメントがある場合はディスプレイスメント) と、使用可能なソース行情報を含む文字列。 |
%Y 書式指定子は、デバッガー マークアップ言語 (DML) をサポートするために使用できます。 詳細については、「 DML を使用したデバッガー出力のカスタマイズ」を参照してください。
次の表は、%Y 書式指定子の使用方法をまとめたものです。
文字 | 引数の型 | 引数 | 印刷されたテキスト |
%Y{t} | String | Text | 引用符で囲まれた文字列です。 出力形式 (最初の arg) が DML の場合、テキストを DML に変換します。 |
%Y{T} | String | Text | 引用符で囲まれた文字列です。 出力形式に関係なく、常にテキストを DML に変換します。 |
%Y{s} | String | Text | 引用符で囲まれていない文字列。 出力形式 (最初の arg) が DML の場合、テキストを DML に変換します。 |
%Y{S} | String | Text | 引用符で囲まれていない文字列。 出力形式に関係なく、常にテキストを DML に変換します。 |
%Y{as} | ULONG64 | デバッガーの書式設定されたポインター | デバッガーで書式設定されたポインター フィールドの高 32 ビット部分を埋め込むには、空の文字列または 9 文字の間隔を追加します。 余分なスペースは、上の 8 つのゼロと ' 文字を含む 9 つのスペースを出力します。 |
%Y{ps} | ULONG64 | デバッガーの書式設定されたポインター | デバッガーで書式設定されたポインター フィールドの高 32 ビット部分を埋め込むには、空の文字列または 8 文字の間隔を追加します。 |
%Y{l} | ULONG64 | デバッガーの書式設定されたポインター | ソース行情報としてアドレス。 |
このコード スニペットは、%Y 書式指定子の使用方法を示しています。
HRESULT CALLBACK testout(_In_ PDEBUG_CLIENT pClient, _In_ PCWSTR /*pwszArgs*/)
{
HRESULT hr = S_OK;
ComPtr<IDebugControl4> spControl;
IfFailedReturn(pClient->QueryInterface(IID_PPV_ARGS(&spControl)));
spControl->ControlledOutputWide(DEBUG_OUTCTL_DML, DEBUG_OUTPUT_NORMAL, L"DML/NORMAL Y{t}: %Y{t}\n", L"Hello <World>");
spControl->ControlledOutputWide(DEBUG_OUTCTL_DML, DEBUG_OUTPUT_NORMAL, L"DML/NORMAL Y{T}: %Y{T}\n", L"Hello <World>");
spControl->ControlledOutputWide(DEBUG_OUTCTL_DML, DEBUG_OUTPUT_NORMAL, L"DML/NORMAL Y{s}: %Y{s}\n", L"Hello <World>");
spControl->ControlledOutputWide(DEBUG_OUTCTL_DML, DEBUG_OUTPUT_NORMAL, L"DML/NORMAL Y{S}: %Y{S}\n", L"Hello <World>");
spControl->ControlledOutputWide(0, DEBUG_OUTPUT_NORMAL, L"TEXT/NORMAL Y{t}: %Y{t}\n", L"Hello <World>");
spControl->ControlledOutputWide(0, DEBUG_OUTPUT_NORMAL, L"TEXT/NORMAL Y{T}: %Y{T}\n", L"Hello <World>");
spControl->ControlledOutputWide(0, DEBUG_OUTPUT_NORMAL, L"TEXT/NORMAL Y{s}: %Y{s}\n", L"Hello <World>");
spControl->ControlledOutputWide(0, DEBUG_OUTPUT_NORMAL, L"TEXT/NORMAL Y{S}: %Y{S}\n", L"Hello <World>");
spControl->ControlledOutputWide(DEBUG_OUTCTL_DML, DEBUG_OUTPUT_NORMAL, L"DML/NORMAL Y{a}: %Y{a}\n", (ULONG64)0x00007ffa7da163c0);
spControl->ControlledOutputWide(DEBUG_OUTCTL_DML, DEBUG_OUTPUT_NORMAL, L"DML/NORMAL Y{as} 64bit : '%Y{as}'\n", (ULONG64)0x00007ffa7da163c0);
spControl->ControlledOutputWide(DEBUG_OUTCTL_DML, DEBUG_OUTPUT_NORMAL, L"DML/NORMAL Y{as} 32value : '%Y{as}'\n", (ULONG64)0x1);
spControl->ControlledOutputWide(DEBUG_OUTCTL_DML, DEBUG_OUTPUT_NORMAL, L"DML/NORMAL Y{ps} 64bit : '%Y{ps}'\n", (ULONG64)0x00007ffa7da163c0);
spControl->ControlledOutputWide(DEBUG_OUTCTL_DML, DEBUG_OUTPUT_NORMAL, L"DML/NORMAL Y{ps} 32value : '%Y{ps}'\n", (ULONG64)0x1);
spControl->ControlledOutputWide(DEBUG_OUTCTL_DML, DEBUG_OUTPUT_NORMAL, L"DML/NORMAL Y{l}: %Y{l}\n", (ULONG64)0x00007ffa7da163c0);
return hr;
}
このサンプル コードでは、次の出力が生成されます。
0:004> !testout
DML/NORMAL Y{t}: "Hello <World>"
DML/NORMAL Y{T}: "Hello <World>"
DML/NORMAL Y{s}: Hello <World>
DML/NORMAL Y{S}: Hello <World>
TEXT/NORMAL Y{t}: "Hello <World>"
TEXT/NORMAL Y{T}: "Hello <World>"
TEXT/NORMAL Y{s}: Hello <World>
TEXT/NORMAL Y{S}: Hello <World>
DML/NORMAL Y{a}: 00007ffa`7da163c0
DML/NORMAL Y{as} 64bit : ' '
DML/NORMAL Y{as} 32value : ' '
DML/NORMAL Y{ps} 64bit : ' '
DML/NORMAL Y{ps} 32value : ' '
DML/NORMAL Y{l}: [d:\th\minkernel\kernelbase\debug.c @ 443]
[in] Args
書式設定中に出力に挿入する値を表す追加のパラメーターを指定します。 args は 、va_startを使用して初期化する必要があります。 このメソッドは 、va_endを呼び出しません。
戻り値
リターン コード | 説明 |
---|---|
|
メソッドは正常に実行されました。 |
このメソッドは、エラー値を返す場合もあります。 詳細については、「 戻り値 」を参照してください。
注釈
非常に大きな出力文字列を生成する場合、デバッガー エンジンまたはオペレーティング システムの制限に達する可能性があります。 たとえば、デバッガー エンジンの一部のバージョンでは、1 つの出力に対して 16,000 文字の制限があります。 非常に大きな出力が切り捨てられていることが判明した場合は、出力を複数の要求に分割する必要がある場合があります。
マクロ va_list、 va_start、 およびva_end は Stdarg.h で定義されています。
要件
要件 | 値 |
---|---|
対象プラットフォーム | デスクトップ |
Header | dbgeng.h (Dbgeng.h、Stdarg.h を含む) |