Доброго времени суток. Изучаю windbg, стоит задача по crashdump'у определить причину зависания драйвера (самого драйвера нет и исходников тоже нет). Какой алгоритм поиска подобных проблем ? Какие команды при этом использовать ? Заранее спасибо.
Ну, например, самое тупое, что можно сделать: посмотреть какие потоки активны на каждом процессоре (!pcr <n>) и посмотреть их стеки вызовов (!thread <ethread>). Обычно, так можно поймать дедлок на спинлоках. Ещё можно запустить Verifier (в командной строке verifier /flags 0x7b /driver <name> и перезагрузиться), иногда он тоже ловит дедлоки, но не во всех случаях, к сожалению. Если ничего не помогло, тогда тупо получаем список всех потоков в системе (!process 0 6) и анализируем их стеки вызовов, жмём Ctrl-F и ищем имя драйвера (т.е. строку вида "name!"), а там по именам вызываемых функций можно понять примерно, где косяк. Если проблема в I/O-запросах, тогда смотрим список IRPs у потока и анализируем каждый (!irp <irp> 1). Ну и конечно, всё сильно зависит от типа драйвера и его специфики. Да, и разумеется, всё это следует делать будучи подключённым к сбойной системе (например, запустить драйвер в виртуалке, подключиться к ней WinDbg и отлаживать, если это возможно. Если так сделать нет возможности, тогда нужно вручную сгенерировать дамп падения в момент зависания, открыть его в WinDbg, а далее уже действовать, как описано выше. Как создать файл дампа с клавиатуры в момент зависания описано здесь. И, как правильно заметили выше, прежде всего желательно выполнить первичный анализ дампа (если это именно дамп, а не живая система) командой !analyze -v.
Код (Text): KD: Scanning for held locks........................... Resource @ 0x8df8102c Shared 1 owning threads Threads: 8ccbe118-01<*> KD: Scanning for held locks........................................................................................................................................................................................ 6723 total locks, 1 locks currently held 0: kd> !thread 8ccbe118 THREAD 8ccbe118 Cid 01e8.0224 Teb: 7ffdd000 Win32Thread: 00000000 WAIT: (Executive) KernelMode Non-Alertable 91a2b974 NotificationEvent IRP List: 8cf62408: (0006,01d8) Flags: 00060043 Mdl: 8cdf86e0 Not impersonating DeviceMap 90808980 Owning Process 8df58030 Image: wininit.exe Attached Process N/A Image: N/A Wait Start TickCount 39610 Ticks: 6397 (0:00:01:39.953) Context Switch Count 33 UserTime 00:00:00.000 KernelTime 00:00:00.000 Win32 Start Address 0x7784d63e Stack Init 91a2bfd0 Current 91a2b708 Base 91a2c000 Limit 91a29000 Call 0 Priority 14 BasePriority 13 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5 ChildEBP RetAddr Args to Child 91a2b720 82872b15 8ccbe118 00000000 8292dd20 nt!KiSwapContext+0x26 (FPO: [Uses EBP] [0,0,4]) 91a2b758 82871403 8ccbe1d8 8ccbe118 91a2b974 nt!KiSwapThread+0x266 91a2b780 8286b2cf 8ccbe118 8ccbe1d8 00000000 nt!KiCommitThreadWait+0x1df 91a2b7fc 8fa264e2 91a2b974 00000000 00000000 nt!KeWaitForSingleObject+0x393 91a2b81c 8fa250e3 91a2ba20 00000000 00000000 Ntfs!NtfsWaitOnIo+0x1c (FPO: [Non-Fpo]) 91a2b93c 8fa294e8 91a2ba20 8cf62408 9907e0f8 Ntfs!NtfsNonCachedIo+0x456 (FPO: [Non-Fpo]) 91a2ba10 8fa2cbae 91a2ba20 8cf62408 00c8070a Ntfs!NtfsCommonRead+0x1148 (FPO: [Non-Fpo]) 91a2bb54 828404bc 8d452020 8cf62408 8cf62408 Ntfs!NtfsFsdRead+0x279 (FPO: [Non-Fpo]) 91a2bb6c 83b2220c 8d401d08 8cf62408 00000000 nt!IofCallDriver+0x63 91a2bb90 83b223cb 91a2bbb0 8d401d08 00000000 fltmgr!FltpLegacyProcessingAfterPreCallbacksCompleted+0x2aa (FPO: [Non-Fpo]) 91a2bbc8 828404bc 8d401d08 8cf62408 8cf62408 fltmgr!FltpDispatch+0xc5 (FPO: [Non-Fpo]) 91a2bbe0 828a9000 8cdf8698 8ccbe118 8cdf8668 nt!IofCallDriver+0x63 91a2bbfc 828affad 8df81940 8ccbe118 8cdf86a0 nt!IoPageRead+0x1f5 91a2bc94 8288c428 8df58220 75957259 8cdf8669 nt!MiIssueHardFault+0x28c 91a2bd1c 8284a5f8 00000008 75957259 00000001 nt!MmAccessFault+0x2c3a 91a2bd1c 75957259 00000008 75957259 00000001 nt!KiTrap0E+0xdc (FPO: [0,0] TrapFrame @ 91a2bd34) WARNING: Frame IP not in any known module. Following frames may be wrong. 004bf4c0 00000000 00000000 00000000 00000000 0x75957259 0: kd> !irp 8cf62408 Irp is active with 9 stacks 4 is current (= 0x8cf624e4) Mdl=8cdf86e0: No System Buffer: Thread 8ccbe118: Irp stack trace. cmd flg cl Device File Completion-Context [ 0, 0] 0 0 00000000 00000000 00000000-00000000 Args: 00000000 00000000 00000000 00000000 [ 0, 0] 0 0 00000000 00000000 00000000-00000000 Args: 00000000 00000000 00000000 00000000 [ 0, 0] 0 0 00000000 00000000 00000000-00000000 Args: 00000000 00000000 00000000 00000000 >[ 3,34] 10 e0 8d3ef030 00000000 82fcc24e-00000000 Success Error Cancel \Driver\Disk partmgr!PmReadWriteCompletion Args: 00008000 00000000 e7997400 00000000 [ 3, 0] 10 e0 8d3efc70 00000000 82ff07a4-8d3f10e8 Success Error Cancel \Driver\partmgr volmgr!VmpReadWriteCompletionRoutine Args: 83750e9f 00000000 e7997400 00000000 [ 3, 0] 0 e0 8d3f1030 00000000 8fd4f3e2-8d3f18b8 Success Error Cancel \Driver\volmgr fvevol!FvePassThroughCompletion Args: 00008000 00000000 83750e9a 00000000 [ 3, 0] 0 e0 8d3f1800 00000000 8ffa47d0-8cf3aaf8 Success Error Cancel \Driver\fvevol volsnap!VspReadCompletionRoutine Args: 00008000 00000000 e7897400 00000000 [ 3, 0] 0 e1 8d3f55a8 00000000 8fa264f9-91a2b970 Success Error Cancel pending \Driver\volsnap Ntfs!NtfsMasterIrpSyncCompletionRoutine Args: 00008000 00000000 e7897400 00000000 [ 3, 0] 0 0 8d452020 8df81940 00000000-00000000 \FileSystem\Ntfs Args: 00008000 00000000 00012400 00000000 0: kd> !fileobj 8df81940 \Windows\System32\winsta.dll Device Object: 0x8d3f1030 \Driver\volmgr Vpb: 0x8d3f2240 Access: Read SharedRead SharedDelete Flags: 0x44042 Synchronous IO Cache Supported Cleanup Complete Handle Created FsContext: 0x9907e0f8 FsContext2: 0x990819c0 CurrentByteOffset: 0 Cache Data: Section Object Pointers: 8df81070 Shared Cache Map: 00000000 Система зависает где-то при обработке данного файла на ожидании, а как бы поподробнее узнать причину ?
Выполни эти команды: !deadlock, !locks Думаю было исключения в файловом дрове(судя со стека) и локер не был отпущен.
В системе на данный момент в состоянии RUNNING находятся два потока, один из них обрабатывает KeBugCheckEx. А вот второй: Код (Text): 0: kd> !thread 8cc3fa70 THREAD 8cc3fa70 Cid 0004.0034 Teb: 00000000 Win32Thread: 00000000 RUNNING on processor 1 IRP List: 8d3f1398: (0006,0094) Flags: 00060070 Mdl: 00000000 8ced25a8: (0006,0094) Flags: 00060070 Mdl: 00000000 8cf0d778: (0006,0094) Flags: 00060070 Mdl: 00000000 8d3f6140: (0006,0094) Flags: 00060070 Mdl: 00000000 8e3f8458: (0006,0094) Flags: 00060070 Mdl: 00000000 8ce9cb80: (0006,0094) Flags: 00060070 Mdl: 00000000 8ce593b8: (0006,0094) Flags: 00060070 Mdl: 00000000 8cee0008: (0006,0094) Flags: 00060070 Mdl: 00000000 8e0d5468: (0006,0094) Flags: 00060070 Mdl: 00000000 8e9b4598: (0006,0094) Flags: 00060070 Mdl: 00000000 8e2ee888: (0006,0094) Flags: 00060070 Mdl: 00000000 8cf5d400: (0006,0094) Flags: 00060040 Mdl: 00000000 Not impersonating DeviceMap 90808980 Owning Process 8cc20020 Image: System Attached Process N/A Image: N/A Wait Start TickCount 39580 Ticks: 6427 (0:00:01:40.421) Context Switch Count 1790 UserTime 00:00:00.000 KernelTime 00:01:40.437 Win32 Start Address nt!ExpWorkerThread (0x82871e1e) Stack Init 91b1bfd0 Current 91b1b2f8 Base 91b1c000 Limit 91b19000 Call 0 Priority 12 BasePriority 12 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5 ChildEBP RetAddr Args to Child 91b1bbcc 828a6351 8e9cbcb0 00000000 00000000 nt!KeSetEvent+0x64 91b1bc1c 828abfa9 00f5d440 91b1bc48 00000000 nt!IopCompleteRequest+0x23b 91b1bc6c 8282d90e 00000000 00000000 00000000 nt!KiDeliverApc+0x111 91b1bc80 829bb735 af773bd0 af773ad0 8d22c908 nt!KiCheckForKernelApcDelivery+0x24 91b1bcd8 829bad48 af773bd4 00000000 8e0fc390 nt!PnpNotifyTargetDeviceChange+0x146 91b1bd00 82871f2b 8e0fc390 00000000 8cc3fa70 nt!PnpDeviceEventWorker+0x206 91b1bd50 82a1266d 00000001 b032460d 00000000 nt!ExpWorkerThread+0x10d 91b1bd90 828c40d9 82871e1e 00000001 00000000 nt!PspSystemThreadStartup+0x9e 00000000 00000000 00000000 00000000 00000000 nt!KiThreadStartup+0x19 И судя по всему он крутится внутри KeSetEvent в цикле: Код (Text): .text:00454CAD loc_454CAD: ; CODE XREF: KeSetEvent(x,x,x)+68 .text:00454CAD ; KeSetEvent(x,x,x)+71 .text:00454CAD inc edi .text:00454CAE test ds:_HvlLongSpinCountMask, edi .text:00454CB4 jnz short loc_454CC7 .text:00454CB6 test byte ptr ds:_HvlEnlightenments, 40h .text:00454CBD jz short loc_454CC7 .text:00454CBF push edi .text:00454CC0 call _HvlNotifyLongSpinWait@4 ; HvlNotifyLongSpinWait(x) .text:00454CC5 jmp short loc_454CC9 .text:00454CC7 ; --------------------------------------------------------------------------- .text:00454CC7 .text:00454CC7 loc_454CC7: ; CODE XREF: KeSetEvent(x,x,x)+4F .text:00454CC7 ; KeSetEvent(x,x,x)+58 .text:00454CC7 pause .text:00454CC9 .text:00454CC9 loc_454CC9: ; CODE XREF: KeSetEvent(x,x,x)+60 .text:00454CC9 mov eax, [esi] .text:00454CCB test al, al .text:00454CCD js short loc_454CAD Может быть кто-нибудь знает, что здесь проверяется и куда дальше копать ? И видимо пока событие не перейдет состоянии Signal, висит лок на файле.