Metodo IDebugControl3::ControlledOutputVaList (dbgeng.h)

Il metodo ControlledOutputVaList formatta una stringa e invia il risultato ai callback di output registrati con alcuni client del motore.

Sintassi

HRESULT ControlledOutputVaList(
  [in] ULONG   OutputControl,
  [in] ULONG   Mask,
  [in] PCSTR   Format,
  [in] va_list Args
);

Parametri

[in] OutputControl

Specifica un controllo di output che determina i callback di output del client riceveranno l'output. Per i valori possibili, vedere DEBUG_OUTCTL_XXX. Per altre informazioni sull'output, vedere Input e Output.

[in] Mask

Specifica il campo bit di tipo output. Per i valori possibili, vedere DEBUG_OUTPUT_XXX .

[in] Format

Specifica la stringa di formato, come in printf. In genere, i caratteri di conversione funzionano esattamente come fanno in C. Per i caratteri di conversione a virgola mobile, l'argomento a 64 bit viene interpretato come numero a virgola mobile a 32 bit, a meno che non venga usato il modificatore l .

Il carattere di conversione %p è supportato, ma rappresenta un puntatore nello spazio indirizzi di una destinazione. Potrebbe non avere modificatori e usa la formattazione degli indirizzi interni del debugger. Sono supportati i seguenti caratteri di conversione aggiuntivi.

Carattere Tipo di argomento Argomento Testo stampato
%p ULONG64 Puntatore in uno spazio indirizzi. Valore del puntatore.
%N DWORD_PTR (32 o 64 bit, a seconda dell'architettura dell'host) Puntatore nello spazio indirizzi virtuale dell'host. Valore del puntatore. Equivalente al carattere C %p standard.
%I ULONG64 Qualsiasi valore a 64 bit. Valore specificato. Se è maggiore di 0xFFFFFFFF, viene stampato come valore a 64 bit; in caso contrario, viene stampato come valore a 32 bit.
%ma ULONG64 Indirizzo di una stringa ASCII con terminazione NULL nello spazio indirizzi virtuale del processo. Stringa specificata
%mu ULONG64 Indirizzo di una stringa Unicode con terminazione NULL nello spazio indirizzi virtuale del processo. Stringa specificata
%msa ULONG64 Indirizzo di una struttura ANSI_STRING nello spazio indirizzi virtuale del processo. Stringa specificata
%msu ULONG64 Indirizzo di una struttura di UNICODE_STRING nello spazio indirizzi virtuale del processo. Stringa specificata
%y ULONG64 Indirizzo nello spazio indirizzi virtuale del processo di un elemento con informazioni sui simboli. Stringa contenente il nome del simbolo specificato (e lo spostamento, se presente).
%ly ULONG64 Indirizzo nello spazio indirizzi virtuale del processo di un elemento con informazioni sui simboli. Stringa contenente il nome del simbolo specificato (e lo spostamento, se presente), nonché le informazioni sulla riga di origine disponibili.
 

L'identificatore di formato %Y può essere usato per supportare il linguaggio DML (Debugger Markup Language). Per altre informazioni, vedere Personalizzazione dell'output del debugger tramite DML.

La tabella seguente riepiloga l'uso dell'identificatore di formato %Y.

Carattere Tipo di argomento Argomento Testo stampato
%Y{t} string Testo Stringa tra virgolette. Converte il testo in DML se il formato di output (prima arg) è DML.
%Y{T} string Testo Stringa tra virgolette. Converte sempre il testo in DML indipendentemente dal formato di output.
%Y{s} string Testo Stringa senza virgolette. Converte il testo in DML se il formato di output (prima arg) è DML.
%Y{S} string Testo Stringa senza virgolette. Converte sempre il testo in DML indipendentemente dal formato di output.
%Y{as} ULONG64 Puntatore formattato del debugger Aggiunge una stringa vuota o 9 caratteri di spaziatura per spaziare la parte alta a 32 bit dei campi puntatore formattati del debugger. Lo spazio aggiuntivo restituisce 9 spazi che includono i 8 zero superiori e il carattere ' .
%Y{ps} ULONG64 Puntatore formattato del debugger Aggiunge una stringa vuota o 8 caratteri di spaziatura per spaziare la parte alta a 32 bit dei campi puntatore formattati dal debugger.
%Y{l} ULONG64 Puntatore formattato del debugger Indirizzo come informazioni sulla riga di origine.
 

Questo frammento di codice illustra l'uso dell'identificatore di 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;

}

Questo codice di esempio genererà l'output seguente.

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

Specifica parametri aggiuntivi che rappresentano valori da inserire nell'output durante la formattazione. Gli Arg devono essere inizializzati usando va_start. Questo metodo non chiama va_end.

Valore restituito

Codice restituito Descrizione
S_OK
Il metodo è stato eseguito correttamente.
 

Questo metodo può anche restituire valori di errore. Per altre informazioni, vedere Valori restituiti .

Commenti

Quando si generano stringhe di output molto grandi, è possibile raggiungere i limiti del motore del debugger o del sistema operativo. Ad esempio, alcune versioni del motore del debugger hanno un limite di caratteri 16K per un singolo output. Se si rileva che l'output molto grande viene troncato, potrebbe essere necessario suddividere l'output in più richieste.

Le macro va_list, va_start e va_end sono definite in Stdarg.h.

Requisiti

Requisito Valore
Piattaforma di destinazione Desktop
Intestazione dbgeng.h (include Dbgeng.h, Stdarg.h)

Vedi anche

ControlledOutput

Idebugcontrol

IDebugControl2

IDebugControl3

OutputVaList

dprintf