Partager via


Bug Check 0x3B : SYSTEM_SERVICE_EXCEPTION

L’erreur SYSTEM_SERVICE_EXCEPTION a une valeur de 0x0000003B. Cela indique qu’une exception s’est produite lors de l’exécution d’une routine qui passe du code non privilégié au code privilégié.

Important

Cet article s’adresse aux programmeurs. Si vous êtes un client et que vous avez reçu ce code d’erreur d’écran bleu en utilisant votre ordinateur, consultez Résoudre les erreurs d’écran bleu.

Paramètres de SYSTEM_SERVICE_EXCEPTION

Paramètre Description
1 L’exception qui a provoqué l’erreur d’arrêt.
2 L’adresse de l’instruction qui a causé l’erreur d’arrêt
3 L’adresse de l’enregistrement du contexte pour l’exception qui a causé l’erreur d’arrêt
4 0 (non utilisé)

Cause

Ce code d’arrêt indique que le code exécuté a rencontré une exception, et que le thread situé en dessous est un thread système.

Cela peut se produire en raison d’une déréférence d’un pointeur NULL ou de l’accès à une adresse incorrecte aléatoire. Cela peut à son tour être causé par une libération prématurée de la mémoire ou une corruption de structure de données.

Les informations sur l’exception retournées dans le paramètre 1 sont décrites dans Valeurs NTSTATUS. Les codes d’exception sont définis dans ntstatus.h, un fichier d’en-tête fourni par le Kit de pilotes Windows. (Pour plus d’informations, veuillez consulter la section Fichiers d’en-tête dans le Kit de pilotes Windows).

Les codes d’exception courants incluent :

  • 0x80000003 : STATUS_BREAKPOINT

    Un point d’arrêt ou un ASSERT a été rencontré alors qu’aucun débogueur noyau n’était attaché au système.

  • 0xC0000005 : STATUS_ACCESS_VIOLATION

    Une violation d’accès à la mémoire s’est produite.

Résolution

Pour déterminer la cause spécifique et créer une correction de code, il faut de l’expérience en programmation et avoir accès au code source du module défaillant.

Pour déboguer ce problème, utilisez la commande .cxr (afficher l’enregistrement de contexte) avec le paramètre 3, puis utilisez kb (afficher la trace de la pile). Vous pouvez également définir un point d’arrêt dans le code qui précède ce code d’arrêt et tenter d’avancer pas à pas dans le code fautif. Utilisez les commandes u, ub, uu (désassembler) pour voir le code de programme assembleur.

L’extension de débogueur !analyze affiche des informations sur le contrôle d’erreur et peut être utile pour déterminer la cause racine. L’exemple suivant est la sortie de !analyze.

SYSTEM_SERVICE_EXCEPTION (3b)
An exception happened while executing a system service routine.
Arguments:
Arg1: 00000000c0000005, Exception code that caused the bugcheck
Arg2: fffff802328375b0, Address of the instruction which caused the bugcheck
Arg3: ffff9c0a746c2330, Address of the context record for the exception that caused the bugcheck
Arg4: 0000000000000000, zero.
...

Pour plus d’informations sur WinDbg et !analyze, consultez les rubriques suivantes :

Pour plus d’informations sur l’utilisation de la mémoire Windows, veuillez consulter >Windows Internals 7th Edition Part 1 by Pavel Yosifovich, Mark E. Russinovich, David A. Solomon and Alex Ionescu.

Identifier le pilote

Si un pilote responsable de l’erreur peut être identifié, son nom est affiché sur l’écran bleu et stocké en mémoire à l’emplacement (PUNICODE_STRING) KiBugCheckDriver. Vous pouvez utiliser dx (afficher l’expression du modèle d’objet de débogueur), une commande de débogueur, pour l’afficher : dx KiBugCheckDriver.

kd> dx KiBugCheckDriver
KiBugCheckDriver                 : 0xffffe10b9991e3e8 : "nvlddmkm.sys" [Type: _UNICODE_STRING *]

Utilisez l’extension !error pour afficher des informations sur le code d’exception dans le paramètre 1. Voici un exemple de sortie de !error.

2: kd> !error 00000000c0000005
Error code: (NTSTATUS) 0xc0000005 (3221225477) - The instruction at 0x%p referenced memory at 0x%p. The memory could not be %s.

Consultez la sortie TEXTE DE LA PILE de WinDbg pour des indices sur ce qui était en cours d’exécution lorsque la défaillance s’est produite. Si plusieurs fichiers de vidage sont disponibles, comparez leurs informations pour rechercher un code commun dans la pile. Utilisez des commandes de débogueur comme kb (afficher la trace de la pile) pour examiner le code fautif.

Utilisez la commande suivante pour lister les modules chargés en mémoire : lm t n

Utilisez !memusage pour examiner l’état général de la mémoire du système. Vous pouvez également utiliser les commandes !pte et !pool pour examiner des zones spécifiques de la mémoire.

Dans le passé, cette erreur a été liée à une utilisation excessive de la pool paginée, ce qui peut se produire en raison de pilotes graphiques en mode utilisateur passant de mauvaises données au code noyau. Si vous suspectez que c’est le cas, utilisez les options de pool dans Driver Verifier pour recueillir des informations supplémentaires.

Driver Verifier

Driver Verifier est un outil qui s’exécute en temps réel pour examiner le comportement des pilotes. Par exemple, Driver Verifier vérifie l’utilisation des ressources mémoire, telles que les pools de mémoire. S’il identifie des erreurs dans l’exécution du code du pilote, il crée de manière proactive une exception pour permettre un examen plus approfondi de cette partie du code du pilote. Le gestionnaire de vérification des pilotes est intégré à Windows et est disponible sur tous les PC Windows.

Pour démarrer le gestionnaire de vérification des pilotes, entrez verifier à l’invite de commande. Vous pouvez configurer quels pilotes vérifier. Le code qui vérifie les pilotes ajoute une surcharge lors de son exécution, essayez donc de vérifier le moins de pilotes possible. Pour plus d’informations, consultez Type de débogage.

Notes

Pour résoudre de manière générale les codes de vérification des bogues de Windows, suivez ces suggestions :

  • Si de nouveaux pilotes de périphériques ou services système ont été ajoutés récemment, essayez de les supprimer ou de les mettre à jour. Essayez de déterminer ce qui a changé dans le système pour que le nouveau code de vérification des bogues apparaisse.

  • Consultez le Gestionnaire de périphériques pour voir si des périphériques sont marqués d’un point d’exclamation (!), ce qui indique un problème. Examinez le journal des événements affiché dans les propriétés de tout pilote de périphérique défectueux. Essayez de mettre à jour le pilote associé.

  • Vérifiez le journal système dans l’Observateur d’événements pour d’autres messages d’erreur qui pourraient aider à identifier le périphérique ou le pilote à l’origine de l’erreur. Recherchez dans le journal système des erreurs critiques qui se sont produites dans la même fenêtre temporelle que l’écran bleu.

  • Si vous avez récemment ajouté du matériel au système, essayez de le supprimer ou de le remplacer. Sinon, contactez le fabricant pour savoir si des correctifs sont disponibles.

Pour davantage d’informations concernant le dépannage, veuillez consulter la section Analyser les données d’écran bleu de vérification des bogues.

Voir aussi

Analyse des dumps de crash à l’aide des débogueurs Windows (WinDbg)

Analyse d’un fichier de dump en mode noyau avec WinDbg

Référence du Code de vérification de bogue