!locks (!kdext*.locks)
Расширение !locks в Kdextx86.dll и Kdexts.dll отображает сведения о блокировках ERESOURCE ядра.
Эта команда расширения не должна путаться с командой расширения !ntsdexts.locks .
!locks [Options] [Address]
Параметры
Параметры задает объем отображаемых сведений. Можно использовать любое сочетание следующих параметров:
-v
Отображает подробные сведения о каждой блокировке.
-p
Отображение всех доступных сведений о блокировках, включая статистику производительности.
-d
Отображение сведений обо всех блокировках. В противном случае отображаются только блокировки с конфликтом.)
Адрес
Указывает шестнадцатеричный адрес отображаемой блокировки ERESOURCE. Если адрес равен 0 или опущен, будут отображаться сведения обо всех блокировках ERESOURCE в системе.
DLL-библиотеки
Kdexts.dll
Замечания
Расширение !locks отображает все блокировки, удерживаемые на ресурсах по потокам. Блокировка может быть общей или эксклюзивной, что означает, что другие потоки не могут получить доступ к этому ресурсу. Эта информация полезна при возникновении взаимоблокировки в системе. Взаимоблокировка вызвана одним неисполнимым потоком, включающим монопольную блокировку ресурса, которому требуется выполнение потока.
Обычно можно определить взаимоблокировку в Microsoft Windows 2000, найдя один неисполняющий поток, содержащий монопольную блокировку ресурса, необходимого для выполнения потока. Большинство блокировок являются общими.
Ниже приведен пример базовых выходных данных !locks :
kd> !locks
**** DUMP OF ALL RESOURCE OBJECTS ****
KD: Scanning for held locks......
Resource @ 0x80e97620 Shared 4 owning threads
Threads: ff688da0-01<*> ff687da0-01<*> ff686da0-01<*> ff685da0-01<*>
KD: Scanning for held locks.......................................................
Resource @ 0x80e23f38 Shared 1 owning threads
Threads: 80ed0023-01<*> *** Actual Thread 80ed0020
KD: Scanning for held locks.
Resource @ 0x80d8b0b0 Shared 1 owning threads
Threads: 80ed0023-01<*> *** Actual Thread 80ed0020
2263 total locks, 3 locks currently held
Обратите внимание, что за адресом для каждого потока следует число потоков (например, "-01"). Если за потоком следует "<*>", этот поток является одним из владельцев блокировки. В некоторых случаях начальный адрес потока содержит смещение. В этом случае отображается фактический адрес потока.
Если вы хотите найти дополнительные сведения об одном из этих объектов ресурсов, используйте адрес, следующий за ресурсом @, в качестве аргумента для будущих команд. Для изучения второго ресурса, показанного в предыдущем примере, можно использовать dt ERESOURCE 80d8b0b0 или !thread 80ed0020. Или вы можете использовать расширение !locks еще раз с параметром -v :
kd> !locks -v 80d8b0b0
Resource @ 0x80d8b0b0 Shared 1 owning threads
Threads: 80ed0023-01<*> *** Actual Thread 80ed0020
THREAD 80ed0020 Cid 4.2c Teb: 00000000 Win32Thread: 00000000 WAIT: (WrQueue) KernelMode Non-Alertable
8055e100 Unknown
Not impersonating
GetUlongFromAddress: unable to read from 00000000
Owning Process 80ed5238
WaitTime (ticks) 44294977
Context Switch Count 147830
UserTime 0:00:00.0000
KernelTime 0:00:02.0143
Start Address nt!ExpWorkerThread (0x80506aa2)
Stack Init fafa4000 Current fafa3d18 Base fafa4000 Limit fafa1000 Call 0
Priority 13 BasePriority 13 PriorityDecrement 0
ChildEBP RetAddr
fafa3d30 804fe997 nt!KiSwapContext+0x25 (FPO: [EBP 0xfafa3d48] [0,0,4]) [D:\NT\base\ntos\ke\i386\ctxswap.asm @ 139]
fafa3d48 80506a17 nt!KiSwapThread+0x85 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\nt\base\ntos\ke\thredsup.c @ 1960]
fafa3d78 80506b36 nt!KeRemoveQueue+0x24c (FPO: [Non-Fpo]) (CONV: stdcall) [d:\nt\base\ntos\ke\queueobj.c @ 542]
fafa3dac 805ad8bb nt!ExpWorkerThread+0xc6 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\nt\base\ntos\ex\worker.c @ 1130]
fafa3ddc 8050ec72 nt!PspSystemThreadStartup+0x2e (FPO: [Non-Fpo]) (CONV: stdcall) [d:\nt\base\ntos\ps\create.c @ 2164]
00000000 00000000 nt!KiThreadStartup+0x16 [D:\NT\base\ntos\ke\i386\threadbg.asm @ 81]
1 total locks, 1 locks currently held