Método IDebugControl::ControlledOutput (dbgeng.h)
El método ControlledOutput da formato a una cadena y envía el resultado a las devoluciones de llamada de salida registradas con algunos de los clientes del motor.
Sintaxis
HRESULT ControlledOutput(
[in] ULONG OutputControl,
[in] ULONG Mask,
[in] PCSTR Format,
...
);
Parámetros
[in] OutputControl
Especifica un control de salida que determina cuáles de las devoluciones de llamada de salida de los clientes recibirán la salida. Para obtener los valores posibles, consulte DEBUG_OUTCTL_XXX. Para obtener más información sobre la salida, consulte Entrada y salida.
[in] Mask
Especifica el campo de bits de tipo de salida. Consulte DEBUG_OUTPUT_XXX para obtener los valores posibles.
[in] Format
Especifica la cadena de formato, como en printf. Normalmente, los caracteres de conversión funcionan exactamente igual que en C. Para los caracteres de conversión de punto flotante, el argumento de 64 bits se interpreta como un número de punto flotante de 32 bits a menos que se use el modificador l .
Se admite el carácter de conversión %p , pero representa un puntero en el espacio de direcciones de un destino. Es posible que no tenga modificadores y use el formato de dirección interna del depurador. Se admiten los siguientes caracteres de conversión adicionales.
Carácter | Tipo de argumento | Argumento | Texto impreso |
---|---|---|---|
%p | ULONG64 | Puntero en un espacio de direcciones. | Valor del puntero. |
%N | DWORD_PTR (32 o 64 bits, según la arquitectura del host) | Puntero en el espacio de direcciones virtuales del host. | Valor del puntero. (Esto equivale al carácter estándar de C %p ). |
%I | ULONG64 | Cualquier valor de 64 bits. | Valor especificado. Si es mayor que 0xFFFFFFFF, se imprime como un valor de 64 bits; de lo contrario, se imprime como un valor de 32 bits. |
%ma | ULONG64 | Dirección de una cadena ASCII terminada en NULL en el espacio de direcciones virtuales del proceso. | Cadena especificada. |
%mu | ULONG64 | Dirección de una cadena Unicode terminada en NULL en el espacio de direcciones virtuales del proceso. | Cadena especificada. |
%msa | ULONG64 | Dirección de una estructura de ANSI_STRING en el espacio de direcciones virtuales del proceso. | Cadena especificada. |
%msu | ULONG64 | Dirección de una estructura de UNICODE_STRING en el espacio de direcciones virtuales del proceso. | Cadena especificada. |
%y | ULONG64 | Dirección en el espacio de direcciones virtuales del proceso de un elemento con información de símbolos. | Cadena que contiene el nombre del símbolo especificado (y desplazamiento, si existe). |
%ly | ULONG64 | Dirección en el espacio de direcciones virtuales del proceso de un elemento con información de símbolos. | Cadena que contiene el nombre del símbolo especificado (y desplazamiento, si existe), así como cualquier información de línea de origen disponible. |
El especificador de formato %Y se puede usar para admitir el lenguaje de marcado del depurador (DML). Para obtener más información, consulte Personalización de la salida del depurador mediante DML.
En la tabla siguiente se resume el uso del especificador de formato %Y.
Carácter | Tipo de argumento | Argumento | Texto impreso |
%Y{t} | String | Texto | Cadena entrecomillada. Convertirá texto a DML si el formato de salida (primer argumento) es DML. |
%Y{T} | String | Texto | Cadena entrecomillada. Siempre convertirá texto a DML independientemente del formato de salida. |
%Y{s} | String | Texto | Cadena sin comilla. Convertirá texto a DML si el formato de salida (primer argumento) es DML. |
%Y{S} | String | Texto | Cadena sin comilla. Siempre convertirá texto a DML independientemente del formato de salida. |
%Y{as} | ULONG64 | Puntero con formato del depurador | Agrega una cadena vacía o 9 caracteres de espaciado para rellenar la parte alta de 32 bits de los campos de puntero con formato del depurador. El espacio adicional genera 9 espacios que incluyen los 8 ceros superiores más el carácter ' . |
%Y{ps} | ULONG64 | Puntero con formato del depurador | Agrega una cadena vacía o 8 caracteres de espaciado para rellenar la parte superior de 32 bits de los campos de puntero con formato del depurador. |
%Y{l} | ULONG64 | Puntero con formato del depurador | Dirección como información de línea de origen. |
Este fragmento de código muestra el uso del especificador de formato %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;
}
Este código de ejemplo generaría la siguiente salida.
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]
...
Especifica parámetros adicionales que representan valores que se van a insertar en la salida durante el formato.
Valor devuelto
Este método también puede devolver valores de error. Consulte Valores devueltos para obtener más detalles.
Código devuelto | Descripción |
---|---|
|
Método realizado correctamente. |
Comentarios
Al generar cadenas de salida muy grandes, es posible alcanzar los límites del motor del depurador o del sistema operativo. Por ejemplo, algunas versiones del motor del depurador tienen un límite de 16 000 caracteres para una única salida. Si observa que la salida muy grande se está truncando, es posible que tenga que dividir la salida en varias solicitudes.
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Escritorio |
Encabezado | dbgeng.h (incluir Dbgeng.h) |