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}: "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
서식을 지정하는 동안 출력에 삽입할 값을 나타내는 추가 매개 변수를 지정합니다. va_start 사용하여 인수를 초기화해야 합니다. 이 메서드는 va_end 호출하지 않습니다.
반환 값
반환 코드 | Description |
---|---|
|
메서드를 성공적으로 수행했습니다. |
이 메서드는 오류 값을 반환할 수도 있습니다. 자세한 내용은 반환 값을 참조하세요 .
설명
매우 큰 출력 문자열을 생성할 때 디버거 엔진 또는 운영 체제의 제한에 도달할 수 있습니다. 예를 들어 디버거 엔진의 일부 버전에는 단일 출력에 대한 16K 문자 제한이 있습니다. 매우 큰 출력이 잘리는 것을 발견하면 출력을 여러 요청으로 분할해야 할 수 있습니다.
매크로 va_list, va_start 및 va_end Stdarg.h에 정의되어 있습니다.
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 데스크톱 |
머리글 | dbgeng.h(Dbgeng.h, Stdarg.h 포함) |