lundi 23 juin 2008

... de code hexadécimal sur fond bleu

Durant quelques semaines, mon installation de Windows XP avait quelques ratés : un écran bleu après quelques heures de fonctionnement. J'ai voulu en savoir un peu plus et je me suis lancé dans le déchiffrement des différents messages.

Mais qu'est ce qu'un écran bleu ? Tout simplement un message d'alerte du coeur du système d'exploitation indiquant que quelque chose s'est mal déroulé. Windows affiche alors une série de code d'erreur. Dans mon cas tout les écrans avaient le même premier code :

0x0000008E == KERNEL_MODE_EXCEPTION_NOT_HANDLED

Microsoft faisant bien les choses, nous disposons d'une description complète de ce code sur msdn. Le deuxième paramètre indique l'adresse et le troisième un "trap frame". J'ai donc :
1 Except code : 0xC0000005
2 Address : 0x8062BFBF
3 trap frame : 0xBEE482E4
4 reserved : 0x00000000
Un autre écran bleu me donne :
1 Except code : 0xC0000005
2 Address : 0x8062BFBF
3 trap frame : 0xB71946D4
4 reserved : 0x00000000
Pour le code d'exception, rien de plus facile, il suffit de regarder dans le même article et j'ai :
0xC0000005 == STATUS_ACCESS_VIOLATION
En gros une violation d'accès mémoire. Le lecteur curieux pourra aller voir ntstatus.h pour le detail.
0xC0000005: STATUS_ACCESS_VIOLATION indicates that a memory
access violation occurred.
MSDN indique quelques pistes pour résoudre le problème:
  • Vérifiez l'espace disque : OK pour moi
  • Si il y a un driver identifé, désactivez le ou autre : pas de driver mentionné
  • Changez de carte vidéo : je n'en ai pas sous la main.
  • Mettez à jour le BIOS : j'ai fait çà il y a quelques années, je ne souhaite pas brancher ma puce à chaud sur un autre PC. Je n'ai plus le goût du risque.
  • Désactivez les options de cache mémoire dans le BIOS.
Bref, rien de transcendant là dedans. Je réendosse mon costume de mineur et je vais au fin fond d'internet à la recherche du deuxième paramètre 0x8062BFBF.Au détour d'un couloir mal éclairé, je découvre le message d'un utilisateur ayant le même problème. Dessous, une petite lanterne parle de minidump et indique que la cause est toujours la même nt!HvpGetCellMapped+5f :

>> All of the minidumps are crashed with same symptom.
>>
>> BugCheck 1000008E, {c0000005, 8062bfbf, b625598c, 0}
>> Probably caused by : ntkrnlpa.exe ( nt!HvpGetCellMapped+5f )
>> The registry is corrupted. Refer this problems :
>> http://www.techspot.com/vb/showthread.php?p=236454#post236454
>> http://www.techspot.com/vb/all/windows/t-63005-BSOD-Memory-Problems.html


La base de registre aurait donc un problème. Mais par quel moyen cette personne est elle arrivée à cette conclusion ?

La réponse est WinDBG, un utilitaire de Microsoft pour mener ce genre d'analyse. A chaque écran bleu, il est possible de garder une trace de l'étât du coeur de Windows au momment du plantage, c'est un fichier que l'on nomme minidump. WinDBG permet de le décrypter.

Je charge donc le dernier minidump et je me lance :

Debugging Details:
------------------

EXCEPTION_CODE: (NTSTATUS) 0xc0000005 - L'instruction "0x%08lx" emploie l'adresse m moire "0x%08lx". La m moire ne peut pas tre "%s".


FAULTING_IP:
nt!HvpGetCellMapped+5f
8062bfbf 8b4304 mov eax,dword ptr [ebx+4]

TRAP_FRAME: b71946d4 -- (.trap 0xffffffffb71946d4)
ErrCode = 00000000
eax=00001ff0 ebx=00001ff0 ecx=889ab6a0 edx=00000007 esi=e2525b60 edi=00000fff
eip=8062bfbf esp=b7194748 ebp=b7194790 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00010246
nt!HvpGetCellMapped+0x5f:
8062bfbf 8b4304 mov eax,dword ptr [ebx+4] ds:0023:00001ff4=????????
Resetting default scope

CUSTOMER_CRASH_COUNT: 1
DEFAULT_BUCKET_ID: DRIVER_FAULT
BUGCHECK_STR: 0x8E
PROCESS_NAME: firefox.exe

LAST_CONTROL_TRANSFER: from 8062bed0 to 8062bfbf

STACK_TEXT:
b7194790 8062bed0 e2525b60 00ffffff e2525b60 nt!HvpGetCellMapped+0x5f
b71947a4 80630364 e2525b60 00ffffff d08f9664 nt!HvpGetHCell+0x10
b71947c0 80634e9c e2525b60 00ffffff e2525b60 nt!HvMarkCellDirty+0x30
b71947e0 80634fd6 e2525b60 002b8660 e1098170 nt!CmpMarkKeyDirty+0x68
b71947f8 8062ab42 e2525b60 002b8660 00000001 nt!CmpFreeKeyByCell+0x14
b7194828 806191a2 e2a4c4a8 b7194894 00128740 nt!CmDeleteKey+0x8c
b7194888 8053c808 00000540 00128768 7c91eb94 nt!NtDeleteKey+0x138
b7194888 7c91eb94 00000540 00128768 7c91eb94 nt!KiFastCallEntry+0xf8
WARNING: Frame IP not in any known module. Following frames may be wrong.
00128768 00000000 00000000 00000000 00000000 0x7c91eb94

STACK_COMMAND: kb

FOLLOWUP_IP:
nt!HvpGetCellMapped+5f
8062bfbf 8b4304 mov eax,dword ptr [ebx+4]

SYMBOL_STACK_INDEX: 0
SYMBOL_NAME: nt!HvpGetCellMapped+5f
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: nt
IMAGE_NAME: ntkrnlpa.exe
DEBUG_FLR_IMAGE_TIMESTAMP: 42250a1d
FAILURE_BUCKET_ID: 0x8E_nt!HvpGetCellMapped+5f
BUCKET_ID: 0x8E_nt!HvpGetCellMapped+5f
Followup: MachineOwner

Pour mémoire les quelques commandes que j'ai utilisées dans WinDBG sont:
  • .bugcheck : liste les données du code
  • .kb : liste la pile (stack trace)
  • .kv : liste les trap frames
  • .trap : récupére les registres au moment de l'erreur
ESI est le pointeur d'instruction, une valeur de zéro est logiquement un problème. On refait une demande de la pile (kb).

La base de registre de mon utilisateur est corrompu. J'ai donc créé un nouvel utilisateur, migré mes préférences applicatives et tout fonctionne correctement.

D'autres questions ?

Aucun commentaire: