Lecture des données de rappel de vérification des bogues

De nombreux pilotes fournissent des routines de rappel case activée de bogues. Lorsque Windows émet un bogue case activée, il appelle ces routines avant d’arrêter le système. Ces routines peuvent spécifier et écrire dans des zones de mémoire appelées données de rappel et données de rappel secondaires.

Utilisation de BugCheckCallbackKBUGCHECK_CALLBACK_ROUTINE
Les données écrites par cette routine font partie des données de rappel. Les données ne sont pas incluses dans le fichier de vidage sur incident.

Utilisation de BugCheckSecondaryDumpDataCallbackKBUGCHECK_REASON_CALLBACK_ROUTINE
Les données écrites par cette routine font partie des données de rappel secondaires. Les données sont incluses dans le fichier de vidage sur incident.

BugCheckAddPagesCallback utiliser KBUGCHECK_REASON_CALLBACK_ROUTINE
Les pages spécifiées par cette routine font partie des données de rappel. Les données de ces pages sont incluses dans le fichier de vidage sur incident.

La quantité de données de rappel et de rappel secondaire disponibles pour le débogueur dépend de plusieurs facteurs :

  • Si vous effectuez un débogage en direct d’un système bloqué, les données de rappel qui ont déjà été écrites par BugCheckCallback ou spécifiées par BugCheckAddPagesCallback seront disponibles. Les données de rappel secondaires ne seront pas disponibles, car elles ne sont stockées dans aucun emplacement de mémoire fixe.

  • Si vous déboguez un vidage de mémoire complet ou un vidage de la mémoire du noyau, les données de rappel spécifiées par BugCheckAddPagesCallback et les données de rappel secondaires écrites par BugCheckSecondaryDumpDataCallback seront disponibles. Les données de rappel écrites par BugCheckCallback ne seront pas disponibles.

  • Si vous déboguez un vidage de mémoire de petite taille, les données de rappel ne sont pas disponibles. Les données de rappel secondaires seront disponibles.

Pour plus d’informations sur ces différentes tailles de fichiers de vidage, consultez Variétés de fichiers de vidage Kernel-Mode.

Affichage des données de rappel

Pour afficher les données de rappel case activée de bogue, vous pouvez utiliser l’extension !bugdump.

Sans paramètres, !bugdump affiche les données de tous les rappels.

Pour afficher les données d’une routine de rappel spécifique, utilisez le composant!bugdump, où Component est le même paramètre que celui qui a été passé à KeRegisterBugCheckCallback lors de l’inscription de cette routine.

Affichage des données de rappel secondaires

Il existe deux méthodes pour afficher les données de rappel secondaire. Vous pouvez utiliser la commande .enumtag ou écrire votre propre extension de débogueur.

Chaque bloc de données de rappel secondaire est identifié par une balise GUID. Cette balise est spécifiée par le champ Guid du paramètre (KBUGCHECK_SECONDARY_DUMP_DATA)ReasonSpecificData transmis à BugCheckSecondaryDumpDataCallback.

La commande .enumtag (Énumérer les données de rappel secondaires) n’est pas un instrument très précis. Il affiche chaque bloc de données secondaire, en affichant la balise, puis en affichant les données au format hexadécimal et ASCII. Il est généralement utile uniquement de déterminer quelles balises sont réellement utilisées pour les blocs de données secondaires.

Pour utiliser ces données de manière plus pratique, il est recommandé d’écrire votre propre extension de débogueur. Cette extension doit appeler des méthodes dans le fichier d’en-tête dbgeng.h. Pour plus d’informations, consultez Écriture de nouvelles extensions de débogueur.

Si vous connaissez la balise GUID du bloc de données secondaire, votre extension doit utiliser la méthode IDebugDataSpaces3 ::ReadTagged pour accéder aux données. Son prototype est le suivant :

STDMETHOD(ReadTagged)(
    THIS_
    IN LPGUID Tag,
    IN ULONG Offset,
    OUT OPTIONAL PVOID Buffer,
    IN ULONG BufferSize,
    OUT OPTIONAL PULONG TotalSize
    ) PURE; 

Voici un exemple d’utilisation de cette méthode :

UCHAR RawData[MY_DATA_SIZE];
GUID MyGuid = .... ;

Success = DataSpaces->ReadTagged(  &MyGuid,  0,  RawData,
                                   sizeof(RawData),  NULL); 

Si vous fournissez un BufferSize trop petit, ReadTagged réussit, mais écrit uniquement le nombre d’octets demandé dans Buffer. Si vous spécifiez un BufferSize trop volumineux, ReadTagged réussit, mais écrit uniquement la taille de bloc réelle dans Buffer. Si vous fournissez un pointeur pour TotalSize, ReadTagged l’utilise pour retourner la taille du bloc réel. Si le bloc n’est pas accessible, ReadTagged retourne un échec status code.

Si deux blocs ont des balises GUID identiques, le premier bloc correspondant est retourné et le deuxième bloc est inaccessible.

Si vous n’êtes pas sûr de la balise GUID de votre bloc, vous pouvez utiliser les méthodes IDebugDataSpaces3 ::StartEnumTagged, IDebugDataSpaces3 ::GetNextTagged et IDebugDataSpaces3 ::EndEnumTagged pour énumérer les blocs balisés. Leurs prototypes sont les suivants :

STDMETHOD(StartEnumTagged)(
    THIS_
    OUT PULONG64 Handle
    ) PURE;

STDMETHOD(GetNextTagged)(
    THIS_
    IN ULONG64 Handle,
    OUT LPGUID Tag,
    OUT PULONG Size
    ) PURE;

STDMETHOD(EndEnumTagged)(
    THIS_
    IN ULONG64 Handle
    ) PURE;

Débogage des routines de rappel

Il est également possible de déboguer la routine de rappel elle-même. Les points d’arrêt dans les routines de rappel fonctionnent comme n’importe quel autre point d’arrêt.

Si la routine de rappel provoque un deuxième bogue case activée, ce nouveau bogue case activée sera traité en premier. Toutefois, Windows ne répétera pas certaines parties du processus Arrêter, par exemple, il n’écrira pas un deuxième fichier de vidage sur incident. Le code d’arrêt affiché sur l’écran bleu sera le deuxième bogue case activée code. Si un débogueur de noyau est attaché, des messages sur les deux vérifications de bogues s’affichent généralement.