次の方法で共有


IDebugControl2::ControlledOutput メソッド (dbgeng.h)

ControlledOutput メソッドは、文字列を書式設定し、エンジンのクライアントの一部に登録された 出力コールバックに結果を送信します。

構文

HRESULT ControlledOutput(
  [in] ULONG OutputControl,
  [in] ULONG Mask,
  [in] PCSTR Format,
       ...   
);

パラメーター

[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 書式指定子の使用方法をまとめたものです。

文字 引数の型 引数 印刷されたテキスト
{t} %Yする テキスト 引用符で囲まれた文字列。 出力形式 (最初の引数) が DML の場合、テキストを DML に変換します。
{T} %Yする テキスト 引用符で囲まれた文字列。 出力形式に関係なく、常にテキストを DML に変換します。
{s} %Yする テキスト 引用符で囲まれていない文字列。 出力形式 (最初の引数) が DML の場合、テキストを DML に変換します。
{S} %Yする テキスト 引用符で囲まれていない文字列。 出力形式に関係なく、常にテキストを DML に変換します。
{as} %Yする ULONG64 デバッガーの書式設定されたポインター デバッガーで書式設定されたポインター フィールドの上位 32 ビット部分を埋め込むための空の文字列または 9 文字の間隔を追加します。 余分なスペースは、上の 8 つのゼロと ' 文字を含む 9 個のスペースを出力します。
{ps} %Yする ULONG64 デバッガーの書式設定されたポインター デバッガーで書式設定されたポインター フィールドの上位 32 ビット部分を埋め込むための空の文字列または 8 文字の間隔を追加します。
{l} %Yする 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}: &quot;Hello <World>&quot;
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]

...

書式設定中に出力に挿入される値を表す追加のパラメーターを指定します。

戻り値

このメソッドは、エラー値を返す場合もあります。 詳細については 戻り値の を参照してください。

リターン コード 形容
S_OK
メソッドが成功しました。

備考

非常に大きな出力文字列を生成する場合、デバッガー エンジンまたはオペレーティング システムの制限に達する可能性があります。 たとえば、デバッガー エンジンの一部のバージョンでは、1 つの出力に対して 16,000 文字の制限があります。 非常に大きな出力が切り捨てられている場合は、出力を複数の要求に分割する必要があります。

必要条件

要件 価値
ターゲット プラットフォーム デスクトップ
ヘッダー dbgeng.h (Dbgeng.h を含む)

関連項目

.printf する

ControlledOutputVaList

IDebugControl

IDebugControl2

IDebugControl3

出力

dprintf する