IDebugControl2::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로 종료된 유니코드 문자열의 주소입니다. 지정된 문자열입니다.
%msa ULONG64 프로세스의 가상 주소 공간에서 ANSI_STRING 구조체의 주소입니다. 지정된 문자열입니다.
%msu ULONG64 프로세스의 가상 주소 공간에서 UNICODE_STRING 구조체의 주소입니다. 지정된 문자열입니다.
%y ULONG64 기호 정보가 있는 항목의 프로세스 가상 주소 공간 주소입니다. 지정된 기호의 이름을 포함하는 문자열(및 변위(있는 경우))
%ly ULONG64 기호 정보가 있는 항목의 프로세스 가상 주소 공간 주소입니다. 지정된 기호의 이름(및 변위(있는 경우)과 사용 가능한 소스 줄 정보를 포함하는 문자열입니다.
 

%Y 형식 지정자를 사용하여 DML(디버거 태그 언어)을 지원할 수 있습니다. 자세한 내용은 DML을 사용하여 디버거 출력 사용자 지정을 참조하세요.

다음 표에는 %Y 형식 지정자의 사용이 요약되어 있습니다.

문자 인수 형식 인수 인쇄된 텍스트
%Y{t} String 텍스트 따옴표가 붙은 문자열이며, 출력 형식(첫 번째 arg)이 DML인 경우 텍스트를 DML로 변환합니다.
%Y{T} String 텍스트 따옴표가 붙은 문자열이며, 출력 형식에 관계없이 항상 텍스트를 DML로 변환합니다.
%Y{s} String 텍스트 따옴표가 지정되지 않은 문자열입니다. 출력 형식(첫 번째 arg)이 DML인 경우 텍스트를 DML로 변환합니다.
%Y{S} String 텍스트 따옴표가 지정되지 않은 문자열입니다. 출력 형식에 관계없이 항상 텍스트를 DML로 변환합니다.
%Y{as} ULONG64 디버거 형식 포인터 디버거 형식 포인터 필드의 높은 32비트 부분을 패딩하기 위한 빈 문자열 또는 9자 간격을 추가합니다. 추가 공간은 위쪽 80과 ' 문자를 포함하는 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}: &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]

[in] Args

서식을 지정하는 동안 출력에 삽입할 값을 나타내는 추가 매개 변수를 지정합니다. va_start 사용하여 인수를 초기화해야 합니다. 이 메서드는 va_end 호출하지 않습니다.

반환 값

반환 코드 Description
S_OK
메서드를 성공적으로 수행했습니다.
 

이 메서드는 오류 값을 반환할 수도 있습니다. 자세한 내용은 반환 값을 참조하세요 .

설명

매우 큰 출력 문자열을 생성할 때 디버거 엔진 또는 운영 체제의 제한에 도달할 수 있습니다. 예를 들어 디버거 엔진의 일부 버전에는 단일 출력에 대한 16K 문자 제한이 있습니다. 매우 큰 출력이 잘리는 것을 발견하면 출력을 여러 요청으로 분할해야 할 수 있습니다.

매크로 va_list, va_startva_end Stdarg.h에 정의되어 있습니다.

요구 사항

요구 사항
대상 플랫폼 데스크톱
머리글 dbgeng.h(Dbgeng.h, Stdarg.h 포함)

추가 정보

ControlledOutput

IDebugControl

IDebugControl2

IDebugControl3

OutputVaList

dprintf