Méthode IDebugControl ::ControlledOutput (dbgeng.h)
La méthode ControlledOutput met en forme une chaîne et envoie le résultat aux rappels de sortie qui ont été inscrits auprès de certains clients du moteur.
Syntaxe
HRESULT ControlledOutput(
[in] ULONG OutputControl,
[in] ULONG Mask,
[in] PCSTR Format,
...
);
Paramètres
[in] OutputControl
Spécifie un contrôle de sortie qui détermine les rappels de sortie des clients qui recevront la sortie. Pour connaître les valeurs possibles, consultez DEBUG_OUTCTL_XXX. Pour plus d’informations sur la sortie, consultez Entrée et Sortie.
[in] Mask
Spécifie le champ bit de type sortie. Consultez DEBUG_OUTPUT_XXX pour connaître les valeurs possibles.
[in] Format
Spécifie la chaîne de format, comme dans printf. En règle générale, les caractères de conversion fonctionnent exactement comme dans C. Pour les caractères de conversion à virgule flottante, l’argument 64 bits est interprété comme un nombre à virgule flottante 32 bits, sauf si le modificateur l est utilisé.
Le caractère de conversion %p est pris en charge, mais il représente un pointeur dans l’espace d’adressage d’une cible. Il n’a peut-être pas de modificateurs et utilise la mise en forme d’adresse interne du débogueur. Les caractères de conversion supplémentaires suivants sont pris en charge.
Caractère | Type d’argument | Argument | Texte imprimé |
---|---|---|---|
%p | ULONG64 | Pointeur dans un espace d’adressage. | Valeur du pointeur. |
%N | DWORD_PTR (32 ou 64 bits, selon l’architecture de l’hôte) | Pointeur dans l’espace d’adressage virtuel de l’hôte. | Valeur du pointeur. (Cela équivaut au caractère C %p standard.) |
%I | ULONG64 | Toute valeur 64 bits. | Valeur spécifiée. Si cette valeur est supérieure à 0xFFFFFFFF, elle est imprimée sous la forme d’une valeur 64 bits ; sinon, elle est imprimée sous la forme d’une valeur 32 bits. |
%ma | ULONG64 | Adresse d’une chaîne ASCII terminée par NULL dans l’espace d’adressage virtuel du processus. | Chaîne spécifiée. |
%mu | ULONG64 | Adresse d’une chaîne Unicode terminée par NULL dans l’espace d’adressage virtuel du processus. | Chaîne spécifiée. |
%msa | ULONG64 | Adresse d’une structure ANSI_STRING dans l’espace d’adressage virtuel du processus. | Chaîne spécifiée. |
%msu | ULONG64 | Adresse d’une structure UNICODE_STRING dans l’espace d’adressage virtuel du processus. | Chaîne spécifiée. |
%y | ULONG64 | Adresse dans l’espace d’adressage virtuel du processus d’un élément avec des informations de symbole. | Chaîne qui contient le nom du symbole spécifié (et le déplacement, le cas échéant). |
%ly | ULONG64 | Adresse dans l’espace d’adressage virtuel du processus d’un élément avec des informations de symbole. | Chaîne qui contient le nom du symbole spécifié (et le déplacement, le cas échéant), ainsi que les informations de ligne source disponibles. |
Le spécificateur de format %Y peut être utilisé pour prendre en charge le langage de balisage du débogueur (DML). Pour plus d’informations, consultez Personnalisation de la sortie du débogueur à l’aide de DML.
Le tableau suivant récapitule l’utilisation du spécificateur de format %Y.
Caractère | Type d’argument | Argument | Texte imprimé |
%Y{t} | String | Texte | Chaîne entre guillemets. Convertit le texte en DML si le format de sortie (premier argument) est DML. |
%Y{T} | String | Texte | Chaîne entre guillemets. Convertit toujours le texte en DML, quel que soit le format de sortie. |
%Y{s} | String | Texte | Chaîne sans guillemets. Convertit le texte en DML si le format de sortie (premier argument) est DML. |
%Y{S} | String | Texte | Chaîne sans guillemets. Convertit toujours le texte en DML, quel que soit le format de sortie. |
%Y{as} | ULONG64 | Pointeur mis en forme du débogueur | Ajoute une chaîne vide ou 9 caractères d’espacement pour le remplissage de la partie 32 bits élevée des champs de pointeur mis en forme du débogueur. L’espace supplémentaire génère 9 espaces, ce qui inclut les 8 zéros supérieurs plus le caractère ' . |
%Y{ps} | ULONG64 | Pointeur mis en forme du débogueur | Ajoute une chaîne vide ou 8 caractères d’espacement pour le remplissage de la partie 32 bits élevée des champs pointeurs mis en forme du débogueur. |
%Y{l} | ULONG64 | Pointeur mis en forme du débogueur | Adresse en tant qu’informations de ligne source. |
Cet extrait de code illustre l’utilisation du spécificateur de format %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;
}
Cet exemple de code génère la sortie suivante.
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]
...
Spécifie des paramètres supplémentaires qui représentent des valeurs à insérer dans la sortie pendant la mise en forme.
Valeur retournée
Cette méthode peut également retourner des valeurs d’erreur. Pour plus d’informations, consultez Valeurs de retour.
Code de retour | Description |
---|---|
|
La méthode a réussi. |
Remarques
Lors de la génération de chaînes de sortie très volumineuses, il est possible d’atteindre les limites du moteur de débogueur ou du système d’exploitation. Par exemple, certaines versions du moteur de débogueur ont une limite de 16 000 caractères pour une seule sortie. Si vous constatez que la sortie très volumineuse est tronquée, vous devrez peut-être fractionner votre sortie en plusieurs demandes.
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Desktop (Expérience utilisateur) |
En-tête | dbgeng.h (inclure Dbgeng.h) |