Jak zdebugować system po wystąpieniu błędu zatrzymania......
Z pAmIÄTnIkA nIeGrZeCzNeGo AnIoĹkA
Jak zdebugować system po wystąpieniu błędu zatrzymania IRQL_NOT_LESS_OR_EQUAL (0xA)Streszczenie
W tym artykule opisano sposób użycia przykładowej sesji debugowania w celu ustalenia, który sterownik powoduje występowanie następującego komunikatu o błędzie:
Stop Error IRQL_NOT_LESS_OR_EQUAL (0xA)
Symptomy
Gdy zostanie zainstalowany sterownik, system przestaje odpowiadać i pojawia się następujący komunikat o błędzie w funkcji nt!KiActivateWaiterQueue+0x27:
Stop Error IRQL_NOT_LESS_OR_EQUAL (0xA)
Wstępne śledzenie stosu wskazuje na to, że przyczyną problemu jest sterownik Fast Fat.
Przyczyna
Ten problem występuje zwykle wtedy, gdy przed wykonaniem elementu pracy sterowniki wywołają dwa razy funkcję IoQueueWorkItem() lub ExQueueWorkItem() tego samego elementu pracy.
Problem ten dotyczy szczególnie sterowników urządzeń, które przydzielają strukturę IO_WORKITEM lub strukturę WORK_QUEUE_ITEM w sposób statyczny. Takie sterowniki urządzeń muszą zagwarantować, że nie zezwolą na użycie statycznie przydzielonego elementu, który znajduje się w kolejce.
Więcej informacji
Aby zdebugować system, który przestał odpowiadać po wystąpieniu błędu opisanego w sekcji „Symptomy”, wykonaj następujące kroki:
1. Załóżmy na przykład, że został zainstalowany sterownik o nazwie Xyz.sys, system przestał odpowiadać i pojawił się błąd zatrzymania 0xA, o którym wspomniano wcześniej.
2. Uruchom debugera przy użyciu poprawnych symboli, a następnie wykonaj przykładowe debugowanie, które opisano dalej w tym artykule.
W tym przykładzie użyto debugera jądra. Można użyć programu KD lub WinDbg. Z tej metody można również skorzystać, włączając weryfikator sterowników.
3. Polecenie kv debugera wyświetla stos. Poniższy ślad stosu wskazuje, że kolejka WORKER_QUEUE została uszkodzona.
Ślad stosu:
f8979768 804f076c fc502008 ff651fb8 e16de008 nt!KiActivateWaiterQueue+0x27
f8979790 f8462061 00000000 00000000 00000000 nt!KeWaitForSingleObject+0x198
f89797ac f8462289 ff651fb8 00000600 ff651fb8 Fastfat!FatWaitSync+0x18
f897989c f8461e62 ff651fb8 fc502008 e16de008 Fastfat!FatNonCachedIo+0x36b
f8979a2c f845b6b0 ff651fb8 fc502008 fc502008 Fastfat!FatCommonWrite+0xf29
f8979a70 804eca36 82378020 fc502008 823d1698 Fastfat!FatFsdWrite+0xaa
f8979a80 f847f3b8 804f46ad f377404c f8979ab8 nt!IopfCallDriver+0x31
f8979a90 804eca36 82379a08 e27dac88 f8979aec sr!SrWrite+0xa8
f8979ad8 804f46ad f376a0a6 823cafb8 82035ca8 nt!IopfCallDriver+0x31
f8979adc f376a0a6 823cafb8 82035ca8 80570400 nt!IoSetThreadHardErrorMode
4. Po przejrzeniu stosu przedstawionego w kroku 3 można dojść do wniosku, że przyczyną problemu jest sterownik Fast Fat. Jednak w strukturze KQUEUE znajduje się uszkodzony element LIST_ENTRY:
kd> dv
Queue = ffffffff8054eddc
kd> dt -r1 _KQUEUE 8054eddc
+0x000 Header :
+0x000 Type : 0x4 ''
+0x001 Absolute : 0 ''
+0x002 Size : 0xa ''
+0x003 Inserted : 0 ''
+0x004 SignalState : 1
+0x008 WaitListHead : _LIST_ENTRY [ 0x823cb438 - 0x823ca6b0 ]
+0x010 EntryListHead : [ 0x0 - 0x820ae3c8 ]
+0x000 Flink : (null)
+0x004 Blink : 0x820ae3c8 [ 0x0 - 0x8054edec ]
5. Cofnięcie odwołania do struktury BLINK przesuwa wskaźnik stosu na element WORK_QUEUE_ITEM (czyli faktycznie pierwszy parametr w elemencie pracy IO_WORKITEM).
Uwaga Dostęp do definicji struktury elementu pracy IO_WORKITEM można uzyskać przy użyciu serwera symboli dla systemu Windows XP i jego nowszych wersji. W starszych wersjach systemu Windows struktura jest taka sama, ale symbole są niedostępne.
kd> dt -r1 _IO_WORKITEM 820ae3c8
+0x000 WorkItem :
+0x000 List : _LIST_ENTRY [ 0x0 - 0x8054edec ]
+0x008 WorkerRoutine : 0x8057fb78 nt!IopProcessWorkItem+0
+0x00c Parameter : 0x820ae3c8
+0x010 Routine : 0xf289dff0 +0
+0x014 DeviceObject : 0xfe01b110
+0x000 Type : 0
+0x002 Size : 0
+0x004 ReferenceCount : 0
+0x008 DriverObject : (null)
+0x00c NextDevice : (null)
+0x010 AttachedDevice : 0x1fde0970
+0x014 CurrentIrp : (null)
+0x018 Timer : (null)
+0x01c Flags : 0
+0x020 Characteristics : 0x490049
+0x024 Vpb : 0x000c0105
+0x028 DeviceExtension : 0x0001ffff
+0x02c DeviceType : 0x86a24
+0x030 StackSize : 8 ''
+0x034 Queue : __unnamed
+0x05c AlignmentRequirement : 0x7fffffff
+0x060 DeviceQueue : _KDEVICE_QUEUE
+0x074 Dpc : _KDPC
+0x094 ActiveThreadCount : 0
+0x098 SecurityDescriptor : (null)
+0x09c DeviceLock : _KEVENT
+0x0ac SectorSize : 0
+0x0ae Spare1 : 0
+0x0b0 DeviceObjectExtension : (null)
+0x0b4 Reserved : (null)
+0x018 Context : 0x81f4a14c
Uwaga Na podstawie zawartości obiektu urządzenia nie można określić, czy jest on prawidłowy. Zawartość pola Context jest jednak prawidłowa, a polecenie !pool wyświetla wartość pooltag znacznika Culprit Pool Tag.
6. Aby ustalić, czy adres procedury jest prawidłowy, użyj polecenia ln, podając adres puli. Jeśli istnieją symbole, wynikiem użycia polecenia ln na adresie puli będzie odpowiedni adres sterownika culprit. Dlatego można przypuszczać, że element pracy IO_WORKITEM odpowiada pewnemu urządzeniu, które zostało utworzone przez sterownik znacznika puli.
7. W poniższym kodzie kolejka pracy zawiera pojedynczy element. Z tego względu łatwo jest go odnaleźć, cofając odwołanie do struktury BLINK. Ponieważ kolejka pracy może zawierać wiele elementów, należy cofać odwołania do struktur BLINK każdego z elementów pracy, aż do odnalezienia elementu pracy, którego struktura BLINK wskazuje na kolejkę KQUEUE.
kd> !pool 81f4a14c
Pool page 81f4a14c region is Nonpaged pool
*81f4a140 size: 2b8 previous size: 8 (Allocated) *Culprit Pool Tag
Rozwiązanie
Aby zapobiec zatrzymaniu systemu po wystąpieniu tego błędu zatrzymania, wyłącz nieprawidłowo działający sterownik urządzenia, który został wykryty podczas sesji debugowania, i zastąp go innym.
Aby uzyskać więcej informacji i dokumentów z zestawu DDK dla systemu Windows, odwiedź następujące witryny usługi MSDN w sieci Web:
Bug Check 0xA: IRQL_NOT_LESS_OR_EQUAL
http://msdn2.microsoft.co...y/ms793589.aspx
IoQueueWorkItem
http://msdn.microsoft.com...14aa2e7.xml.asp