Partager via


Vérification de bogue 0x1AA : EXCEPTION_ON_INVALID_STACK

La vérification de bogue EXCEPTION_ON_INVALID_STACK a une valeur de 0x000001AA. Cette vérification de bogue indique que la répartition des exceptions est passée dans une pile de noyau non valide. Cela peut indiquer que le pointeur de pile du noyau a été corrompu lors de l’envoi ou du déroulement d’une exception (par exemple, en raison d’une corruption de la pile d’un pointeur de frame), ou qu’un pilote s’exécute à partir d’une pile qui n’est pas une pile légale du noyau.

Important

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

Paramètres EXCEPTION_ON_INVALID_STACK

Paramètre Description

1

Un pointeur vers la pile actuelle.

2

Le type de limite de pile tel que NormalStackLimits (3). Comme la pile n’est pas valide, il s’agit de la meilleure estimation du noyau quant au type de pile qui devrait être actif compte tenu de l’état de l’ordinateur.

Type de limite de pile :

  • 0x0 - Pile de vérification des bogues (n’importe quelle pile si les limites de la pile sont calculées pendant la durée de la vérification du bogue)
  • 0x1 - Pile DPC du processeur
  • 0x2 - Pile KeExpandKernelStackAndCallout(Ex)
  • 0x3 - Pile normale de threads du noyau
  • 0x4 - Pile de threads du noyau lors d’un changement de contexte (ambiguïté sur le thread actif)
  • 0x5 - Une pile d’appels noyau/utilisateur win32k
  • 0x6 - Pile ISR de processeur
  • 0x7 - Pile du débogueur de noyau (n’importe quelle pile lorsque le débogueur du noyau gère les E/S KD)
  • 0x8 - Pile de gestion NMI du processeur
  • 0x9 - Pile de gestion des contrôles d’une machine processeur
  • 0xA - Pile d’exceptions de processeur (utilisée pour distribuer certaines exceptions IRQL levées)

3

Pointeur vers l’enregistrement de contexte représentant le contexte qui était en train de se dérouler (ou d’être distribué pour une exception) lorsque la pile non valide a été trouvée.

4

Fournit un enregistrement d’exception représentant l’exception active en cours de distribution.

Cause

Une tentative d’accès à une pile non valide s’est produite. La taille d’une pile de noyau étant limitée, le développeur doit faire preuve de prudence quant à ses limites, par exemple lorsqu’il l’utilise pour copier des blocs de mémoire vidéo. Pour en savoir plus sur la pile du noyau Windows, consultez Utilisation de la pile du noyau.

Résolution

En utilisant un vidage complet du noyau ou un débogueur, les commandes suivantes peuvent être utiles pour collecter des informations et localiser le code qui accède de manière incorrecte à la mémoire.

Utilisez d’abord la commande !analyze pour collecter des informations, en particulier les paramètres de la vérification de bogue. Examinez également le nom de la ligne source et du module défaillants, le cas échéant.

Arguments:
Arg1: 00000018940ffbe8
Arg2: 0000000000000003
Arg3: ffffe301c8db2900
Arg4: ffffdc0e9ee665d8

Utilisez le lien de commande .trap fourni dans la sortie !analyze pour définir le contexte du trap frame.

2: kd> .trap 0xffffdc0e9ee66680
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=003f8b813f20b6e0 rbx=0000000000000000 rcx=ee7defdd9c530000
rdx=ffffcb81660ea078 rsi=0000000000000000 rdi=0000000000000000
rip=fffff8002b7f8933 rsp=ffffdc0e9ee66810 rbp=ffffcb81511c3010
 r8=0000000000000001  r9=0000000000004014 r10=ffffdc0e9ee66910
r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000
iopl=0         nv up ei pl zr na po nc
dxgmms2!RemoveHeadList+0xd [inlined in dxgmms2!VidSchiSignalRegisteredSyncObjects+0x3f]:
fffff800`2b7f8933 48395808        cmp     qword ptr [rax+8],rbx ds:003f8b81`3f20b6e8=????????????????

Utilisez la commande !vm pour examiner l’utilisation de la mémoire, notamment pour voir la quantité de mémoire des piles du noyau en cours d’utilisation.

0: kd> !vm

Physical Memory:          1541186 (    6164744 Kb)
Available Pages:           470550 (    1882200 Kb)
ResAvail Pages:           1279680 (    5118720 Kb)

...

Kernel Stacks:              13686 (      54744 Kb)

Cette quantité de mémoire utilisée est inférieure à celle disponible dans cet exemple.

Utilisez la commande !thread pour collecter des informations sur ce qui est en cours d’exécution. Dans cet exemple, il semble qu’un thread de travail du planificateur vidéo soit en cours d’exécution.

2: kd> !thread
THREAD ffffcb816348b040  Cid 0c58.4a1c  Teb: 0000000000000000 Win32Thread: 0000000000000000 RUNNING on processor 2
Not impersonating
DeviceMap                 ffff840f38c04170
Owning Process            ffffcb81648980c0       Image:         YourPhone.exe
Attached Process          N/A            Image:         N/A
Wait Start TickCount      34501403       Ticks: 0
Context Switch Count      43             IdealProcessor: 3             
UserTime                  00:00:00.000
KernelTime                00:00:00.015
Win32 Start Address 0x00007fff34656d00
Stack Init ffffdc0e9ee675b0 Current ffffdc0e9ee66610
Base ffffdc0e9ee68000 Limit ffffdc0e9ee61000 Call 0000000000000000
Priority 8 BasePriority 8 PriorityDecrement 0 IoPriority 2 PagePriority 5
...

Utilisez ensuite kb (Afficher l’arborescence des appels de procédure) avec l’option f pour afficher la pile et l’utilisation de la mémoire et voir s’il y a un gros utilisateur de mémoire.

2: kd> kf
...
02        40 ffffdc0e`9ee66850 fffff800`2b7f8801     dxgmms2!VidSchiMarkDeviceAsError+0x4d  
...

Si une partie spécifique du code semble suspecte, utilisez la commande u, ub, uu (Désassembler) pour examiner le code de langage d’assemblage associé.

2: kd> u ffffdc0e`9ee66850 l10
ffffdc0e`9ee66850 1030            adc     byte ptr [rax],dh
ffffdc0e`9ee66852 1c51            sbb     al,51h
ffffdc0e`9ee66854 81cbffffc068    or      ebx,68C0FFFFh
ffffdc0e`9ee6685a e69e            out     9Eh,al
ffffdc0e`9ee6685c 0e              ???
ffffdc0e`9ee6685d dcff            fdiv    st(7),st
ffffdc0e`9ee6685f ff00            inc     dword ptr [rax]
ffffdc0e`9ee66861 0000            add     byte ptr [rax],al
ffffdc0e`9ee66863 0000            add     byte ptr [rax],al
ffffdc0e`9ee66865 0000            add     byte ptr [rax],al
ffffdc0e`9ee66867 000e            add     byte ptr [rsi],cl
ffffdc0e`9ee66869 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686b 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686d 0000            add     byte ptr [rax],al
ffffdc0e`9ee6686f 0010            add     byte ptr [rax],dl
ffffdc0e`9ee66871 301c51          xor     byte ptr [rcx+rdx*2],bl

Utilisez la commande .cxr (Afficher l’enregistrement du contexte) pour afficher l’enregistrement du contexte, à l’aide de la valeur 3 du paramètre fournie par !analyze.

2: kd> .cxr ffffe301c8db2900
rax=003f8b813f20b6e0 rbx=ffffcb813f607650 rcx=ee7defdd9c530000
rdx=ffffcb81660ea078 rsi=0000000000000000 rdi=ffffcb81511c30a8
rip=fffff8002b7f8933 rsp=ffffdc0e9ee66810 rbp=ffffcb81511c3010
 r8=0000000000000001  r9=0000000000004014 r10=ffffdc0e9ee66910
r11=0000000000000000 r12=ffffdc0e9ee66910 r13=ffffcb814019c000
r14=0000000000000000 r15=ffffdc0e9ee66910
iopl=0         nv up ei pl zr na po nc
cs=0010  ss=0018  ds=002b  es=002b  fs=0053  gs=002b             efl=00050246
dxgmms2!RemoveHeadList+0xd [inlined in dxgmms2!VidSchiSignalRegisteredSyncObjects+0x3f]:
fffff800`2b7f8933 48395808        cmp     qword ptr [rax+8],rbx ds:002b:003f8b81`3f20b6e8=????????????????

Utilisez la commande .exr (Afficher l’enregistrement de l’exception) pour afficher l’enregistrement de l’exception, à l’aide de la valeur 4 du paramètre fournie par !analyze.

2: kd> .exr ffffdc0e9ee665d8
ExceptionAddress: fffff8002b7f8933 (dxgmms2!RemoveHeadList+0x000000000000000d)
   ExceptionCode: c0000005 (Access violation)
  ExceptionFlags: 00000000
NumberParameters: 2
   Parameter[0]: 0000000000000000
   Parameter[1]: ffffffffffffffff
Attempt to read from address ffffffffffffffff

L’enregistrement de l’exception indique une tentative de lecture à partir d’une adresse de ffffffffffffffff, qui serait une zone à examiner plus en détail.

Voir aussi

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