****************************************************
* *
* Bugcheck Analysis *
* *
****************************************************
THREAD_STUCK_IN_DEVICE_DRIVER_M (100000ea)
The device driver is spinning in an infinite loop, most likely waiting for
hardware to become idle. This usually indicates problem with the hardware
itself or with the device driver programming the hardware incorrectly.
If the kernel debugger is connected and running when watchdog detects a
timeout condition then DbgBreakPoint() will be called instead of KeBugCheckEx()
and detailed message including bugcheck arguments will be printed to the
debugger. This way we can identify an offending thread, set breakpoints in it,
and hit go to return to the spinning code to debug it further. Because
KeBugCheckEx() is not called the .bugcheck directive will not return bugcheck
information in this case. The arguments are already printed out to the kernel
debugger. You can also retrieve them from a global variable via
"dd watchdog!g_WdBugCheckData l5" (use dq on NT64).
On MP machines it is possible to hit a timeout when the spinning thread is
interrupted by hardware interrupt and ISR or DPC routine is running at the time
of the bugcheck (this is because the timeout's work item can be delivered and
handled on the second CPU and the same time). If this is the case you will have
to look deeper at the offending thread's stack (e.g. using dds) to determine
spinning code which caused the timeout to occur.
Arguments:
Arg1: ff9c9b30, Pointer to a stuck thread object. Do .thread then kb on it to find
the hung location.
Arg2: ffaa7188, Pointer to a DEFERRED_WATCHDOG object.
Arg3: 80ed6050, Pointer to offending driver name.
Arg4: 00000001, Number of times "intercepted" bugcheck 0xEA was hit (see notes).
Debugging Details:
------------------
Database SolnDb not connected
FAULTING_THREAD: ff9c9b30
[b]DEFAULT_BUCKET_ID: GRAPHICS_DRIVER_FAULT[/b]
BUGCHECK_STR: 0xEA
LAST_CONTROL_TRANSFER: from 806a1416 to 8052c1bf
STACK_TEXT:
f18cf4e0 806a1416 00000000 e1548018 e14993e4 nt!KiDispatchInterrupt+0x7f
f18cf4e0 bf99e5df 00000000 e1548018 e14993e4 hal!HalpDispatchInterrupt2ndEntry+0x1b
WARNING: Stack unwind information not available. Following frames may be wrong.
f18cf55c 00000000 f18cfc34 e1548018 f18cf93c ati2dvag+0x55df
STACK_COMMAND: .thread ffffffffff9c9b30 ; kb
FOLLOWUP_IP:
ati2dvag+55df
bf99e5df ?? ???
FOLLOWUP_NAME: MachineOwner
SYMBOL_NAME: ati2dvag+55df
MODULE_NAME: ati2dvag
[b]IMAGE_NAME: ati2dvag.dll[/b]
DEBUG_FLR_IMAGE_TIMESTAMP: 3cc4e115
BUCKET_ID: 0xEA_IMAGE_ati2dvag.dll_DATE_4_23_2002
Followup: MachineOwner
---------
Det lutar alltså åt grafikdrivrutinen, men raden med "WARNING: Stack unwind information not available. Following frames may be wrong." kan påvisa att det inte är så.
Följ punkt 10-14 i den tråd jag länkade till så ska vi se om vi inte kan få min gissning bekräftad eller dementerad. Jag ska rota vidare lite så länge och återkommer om jag hittar något intressant.
Det lutar alltså åt grafikdrivrutinen, men raden med "WARNING: Stack unwind information not available. Following frames may be wrong." kan påvisa att det inte är så.
Att callstacken börjar i ati2dvag.dll är säkert, däremot kan man inte se säkert hur varje frame i callstacken ser ut.
Anledningen till varningen är att man kör optimerad kod och att kompilatorn då kan optimera och använda registret EBP till något helt annat än "det normala" x86-anropet (adress var man hittar info om föregående funktionens stackframe).
Utan symbolfiler (som ju här saknas för ATI-filerna) kan debuggern endast att "anta" att EBP används korrekt för att kunna stega callstacken automatiskt. Det kan mycket väl slå fel, och därför visar debuggern "WARNING: Stack unwind information not available. Following frames may be wrong."
Om man stöter på detta problem går det att manuellt traversera callstacken. Känns som överkurs, men det finns beskrivet hur man gör i hjälpen till windbg under "Manually Walking a Stack".
255 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91