!locks (!kdext*.locks)
Kdextx86.dll 和 Kdexts.dll 中的 !locks 扩展显示有关内核 ERESOURCE 锁的信息。
不要将此扩展命令与 !ntsdexts.locks 扩展命令混淆。
!locks [Options] [Address]
参数
Options 指定要显示的信息量。 可以使用以下选项的任意组合:
-v
显示有关每个锁的详细信息。
-p
显示有关锁的所有可用信息,包括性能统计信息。
-d
显示有关所有锁的信息。 否则,仅显示具有争用的锁。)
地址
指定要显示的 ERESOURCE 锁的十六进制地址。 如果 Address 为 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”)。 如果线程后跟“<*>”,则该线程是锁的所有者之一。 在某些情况下,初始线程地址包含偏移量。 在这种情况下,还会显示实际的线程地址。
如果要查找有关其中一个资源对象的详细信息,请使用“Resource @”后面的地址作为将来命令的参数。 若要调查前面示例中显示的第二个资源,可以使用 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