Fehlerprüfung 0x1AB: UNWIND_ON_INVALID_STACK
Die UNWIND_ON_INVALID_STACK-Fehlerüberprüfung weist den Wert 0x000001AB auf. Es gibt an, dass versucht wurde, außerhalb des gültigen Kernelstapelbereichs auf Arbeitsspeicher zuzugreifen. Insbesondere gibt dieser Fehlercheck an, dass die Stapelentladung in einen ungültigen Kernelstapel gekreuzt wurde. Dies kann darauf hindeuten, dass der Kernelstapelzeiger während der Ausnahmeverteilung oder -entladung beschädigt wurde (z. B. aufgrund einer Stapelbeschädigung eines Framezeigers) oder dass ein Treiber aus einem Stapel ausgeführt wird, der kein legaler Kernelstapel ist.
Zum Zeitpunkt des ungültigen Zugriffs war der Ausnahmedatensatz nicht verfügbar.
Wichtig
Dieser Artikel richtet sich an Programmierer. Wenn Sie ein Kunde sind, der während der Verwendung Ihres Computers einen Bluescreen-Fehlercode erhalten hat, finden Sie weitere Informationen unter Behandeln von Bluescreenfehlern.
UNWIND_ON_INVALID_STACK Parameter
Parameter | BESCHREIBUNG |
---|---|
1 |
Ein Zeiger auf den aktuellen Stapel. |
2 |
Der Typ des Stapellimits, z. B. NormalStackLimits (3). Da der Stapel ungültig ist, stellt dies die beste Schätzung des Kernelstapeltyps dar, der angesichts des Zustands des Computers aktiv sein sollte. Typ des Stapellimits:
|
3 |
Ein Zeiger auf den Kontextdatensatz, der den Kontext darstellt, der beim Auftreten des ungültigen Stapels aufgehoben (oder für eine Ausnahme verteilt) wurde. |
4 |
ExceptionRecord: Reserviert und immer 0 für UNWIND_ON_INVALID_STACK. |
Ursache
Es wurde versucht, auf einen ungültigen Stapel zuzugreifen. Da die Größe des Kernelstapels begrenzt ist, muss der Entwickler mit der Nachverfolgung von Grenzwerten vorsichtig sein, z. B. wenn er zum Kopieren von Videospeicherblöcken verwendet wird. Informationen zum Windows-Kernelstapel finden Sie unter Verwenden des Kernelstapels.
Lösung
Mithilfe eines vollständigen Kernelabbilds oder eines angefügten Debuggers können die folgenden Befehle hilfreich sein, um Informationen zu sammeln und den Code aufzuspüren, der fälschlicherweise auf den Arbeitsspeicher zugreift.
Verwenden Sie zunächst den Befehl !analyze , um Informationen zu sammeln, insbesondere die Fehlerüberprüfungsparameter. Überprüfen Sie auch die fehlerhafte Quellzeile und den Modulnamen, falls verfügbar.
Arguments:
Arg1: 89344350fffff607
Arg2: 0000000000000003
Arg3: fffff607893436c4
Arg4: fffff60789343ea8
Verwenden Sie den angegebenen .trap-Befehlslink in der !analyze-Ausgabe, um den Kontext auf den Trapframe festzulegen.
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
Verwenden Sie den Befehl !thread , um Informationen darüber zu sammeln, was ausgeführt wird. In diesem Beispiel sieht es so aus, als ob ein Videoplaner-Workerthread ausgeführt wird.
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
...
Verwenden Sie dann kb (Display Stack Backtrace) mit der Option f, um den Stapel und die Speicherauslastung anzuzeigen, um festzustellen, ob ein Großer Arbeitsspeicherbenutzer vorhanden ist.
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
...
Wenn ein bestimmter Teil des Codes verdächtig aussieht, verwenden Sie den Befehl u, ub, uu (Unassemble), um den zugeordneten Assemble-Sprachcode zu untersuchen.
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]
Verwenden Sie den Befehl .cxr (Kontextdatensatz anzeigen), um den Kontextdatensatz mithilfe des von !analyze bereitgestellten Parameters 3 anzuzeigen.
.cxr fffff607893436c4
Verwenden Sie den Befehl !vm , um die Speicherauslastung zu untersuchen, z. B. um zu sehen, wie viel Des Kernelstapelspeichers verwendet wird.
0: kd> !vm
Physical Memory: 1541186 ( 6164744 Kb)
Available Pages: 470550 ( 1882200 Kb)
ResAvail Pages: 1279680 ( 5118720 Kb)
...
Kernel Stacks: 13686 ( 54744 Kb)
Verwenden Sie den Befehl !stacks mit dem Parameter 2, um Informationen zu Stapeln anzuzeigen. Die Ausführung dieses Befehls kann einige Zeit in Anspruch nehmen. Untersuchen Sie die Ausgabe auf wiederholte Muster der blockierten Ausführung, die auf und für weitere Untersuchungen verweisen können.
Weitere Informationen
Bug Check Code Reference (Referenz zu Fehlerüberprüfungscodes)