Partager via


0x1AB de vérification des bogues : UNWIND_ON_INVALID_STACK

La valeur du bogue case activée UNWIND_ON_INVALID_STACK a la valeur 0x000001AB. Cela indique qu’une tentative d’accès à la mémoire a été effectuée en dehors de la plage de pile du noyau valide. En particulier, ce BogueCheck indique que la pile qui se déroule s’est croisée dans une pile de noyau non valide. Cela peut indiquer que le pointeur de la pile du noyau est endommagé pendant la distribution ou le déroulement des exceptions (par exemple, en raison d’une altération de la pile d’un pointeur d’image), ou qu’un pilote s’exécute à partir d’une pile qui n’est pas une pile de noyau légale.

Au moment où l’accès non valide s’est produit, l’enregistrement d’exception n’était pas disponible.

Important

Cet article s’adresse aux programmeurs. Si vous êtes un client qui a reçu un code d’erreur d’écran bleu lors de l’utilisation de votre ordinateur, consultez Résoudre les erreurs d’écran bleu.

paramètres UNWIND_ON_INVALID_STACK

Paramètre Description

1

Pointeur vers la pile actuelle.

2

Type de limite de pile tel que NormalStackLimits (3). Étant donné que la pile n’est pas valide, cela représente la meilleure estimation du noyau quant au type de pile de noyau qui doit être actif compte tenu de l’état de la machine.

Type de limite de pile :

  • 0x0 - Pile de vérification des bogues (toute pile si les limites de pile sont calculées pendant le temps de vérification des bogues)
  • 0x1 : pile DPC du processeur
  • 0x2 - Pile KeExpandKernelStackAndCallout(Ex)
  • 0x3 : pile de threads de noyau normale
  • 0x4 : pile de threads de noyau pendant l’échange de contexte de thread (ambiguë quel thread est actif)
  • 0x5 : pile de légendes utilisateur/noyau win32k
  • 0x6 : pile ISR du processeur
  • 0x7 - Pile du débogueur noyau (toute pile lorsque le débogueur de noyau gère les E/S KD)
  • 0x8 : pile de gestion NMI du processeur
  • 0x9 : machine processeur case activée pile de gestion
  • 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 cours de déwound (ou distribué pour une exception) lorsque la pile non valide a été rencontrée.

4

ExceptionRecord : réservé et toujours 0 pour UNWIND_ON_INVALID_STACK.

Cause

Une tentative d’accès à une pile non valide s’est produite. Étant donné que la pile du noyau est de taille limitée, le développeur doit faire attention au suivi de ses limites, par exemple lorsqu’il l’utilise pour copier des blocs de mémoire vidéo. Pour plus d’informations sur la pile du noyau Windows, consultez Utilisation de la pile de noyau.

Résolution

À l’aide d’un vidage de noyau complet ou d’un débogueur attaché, les commandes suivantes peuvent être utiles pour collecter des informations et suivre le code qui n’accède pas correctement à la mémoire.

Tout d’abord, utilisez la commande !analyze pour collecter des informations, en particulier les paramètres de bogue case activée. Examinez également la ligne source d’erreur et le nom du module, le cas échéant.

Arguments:
Arg1: 89344350fffff607
Arg2: 0000000000000003
Arg3: fffff607893436c4
Arg4: fffff60789343ea8

Utilisez le lien de commande .trap fourni dans la sortie !analyze pour définir le contexte sur le cadre d’interruption.

TRAP_FRAME:  fffff60789343f50 -- (.trap 0xfffff60789343f50)
NOTE: The trap frame does not contain all registers.
Some register values may be zeroed or incorrect.
rax=fffff607893441e8 rbx=0000000000000000 rcx=0000000010000004
rdx=0000000000000002 rsi=0000000000000000 rdi=0000000000000000
rip=fffff8026dc296cf rsp=fffff607893440e8 rbp=fffff60789344350
 r8=fffff8028e7a08b2  r9=0000000000000008 r10=fffff8029e9c3980
r11=fffff607893440f8 r12=0000000000000000 r13=0000000000000000
r14=0000000000000000 r15=0000000000000000

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

2: kd> !thread
THREAD ffff8f8e9af25080  Cid 0004.0378  Teb: 0000000000000000 Win32Thread: 0000000000000000 RUNNING on processor 2
Not impersonating
DeviceMap                 ffffd601dbe63e30
Owning Process            ffff8f8e99ab4040       Image:         System
Attached Process          N/A            Image:         N/A
Wait Start TickCount      14361          Ticks: 0
Context Switch Count      64607          IdealProcessor: 1             
UserTime                  00:00:00.000
KernelTime                00:00:06.046
Win32 Start Address dxgmms2!VidSchiWorkerThread (0xfffff8027a70d100)
Stack Init fffff60789344c70 Current fffff607893445c0
Base fffff60789345000 Limit fffff6078933f000 Call 0000000000000000
Priority 16 BasePriority 16 PriorityDecrement 0 IoPriority 2 PagePriority 5
...

Utilisez ensuite kb (Display Stack Backtrace) avec l’option f pour afficher la pile et l’utilisation de la mémoire pour voir s’il existe un grand utilisateur de mémoire.

2: kd> kf
...
02       198 fffff607`89344460 fffff802`8e6b41d5     amdkmdag+0x2308b2
03       120 fffff607`89344580 fffff802`8e59eb35     amdkmdag+0x1441d5
04        30 fffff607`893445b0 fffff802`8e62b5e8     amdkmdag+0x2eb35
05        c0 fffff607`89344670 fffff802`8e623f6c     amdkmdag+0xbb5e8
...

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

2: kd> u fffff607`893442c8 l10
fffff607`893442c8 d04234          rol     byte ptr [rdx+34h],1
fffff607`893442cb 8907            mov     dword ptr [rdi],eax
fffff607`893442cd f6ff            idiv    bh
fffff607`893442cf ff01            inc     dword ptr [rcx]
fffff607`893442d1 17              ???
fffff607`893442d2 c4              ???
fffff607`893442d3 9f              lahf
fffff607`893442d4 8e8fffff0060    mov     cs,word ptr [rdi+6000FFFFh]
fffff607`893442da 5a              pop     rdx
fffff607`893442db 9f              lahf
fffff607`893442dc 8e8fffff0000    mov     cs,word ptr [rdi+0FFFFh]
fffff607`893442e2 0000            add     byte ptr [rax],al
fffff607`893442e4 0000            add     byte ptr [rax],al
fffff607`893442e6 0000            add     byte ptr [rax],al
fffff607`893442e8 7527            jne     fffff607`89344311
fffff607`893442ea 6e              outs    dx,byte ptr [rsi]

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

.cxr fffff607893436c4

Utilisez la commande !vm pour examiner l’utilisation de la mémoire, par exemple pour voir la quantité de mémoire de la pile du noyau utilisée.

0: kd> !vm

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

...

Kernel Stacks:              13686 (      54744 Kb)

Utilisez la commande !stacks , avec le paramètre 2 pour afficher des informations sur les piles. L’exécution de cette commande peut prendre un certain temps. Examinez la sortie pour les modèles répétés d’exécution bloquée qui peuvent pointer vers et zone pour une investigation plus approfondie.

Voir aussi

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