!cs

!cs 扩展显示一个或多个关键节或整个关键节树。

!cs [-s] [-l] [-o] 
!cs [-s] [-o] Address 
!cs [-s] [-l] [-o] StartAddress EndAddress 
!cs [-s] [-o] -d InfoAddress 
!cs [-s] -t [TreeAddress] 
!cs -? 

参数

参数 说明
-s 如果此信息可用,则显示每个关键节的初始化堆栈跟踪。
-l 仅显示锁定的关键节。
-o 显示正在显示的任何锁定关键节的所有者堆栈。
Address 指定要显示的关键节地址。 如果省略此参数,调试器会显示当前进程中的所有关键节。
StartAddress 指定拟搜索关键节的地址范围的开头。
EndAddress 指定拟搜索关键节的地址范围的末尾。
-d 显示与 DebugInfo 相关的关键节。
InfoAddress 指定 DebugInfo 的地址。
-t 显示关键节树。 在使用 -t 选项之前,必须激活目标进程的 应用程序验证工具 ,并选择 检查锁定用法选项。
TreeAddress 指定关键节树根的地址。 如果省略此参数或指定为零,调试器将显示当前进程的关键节树。
-? “调试器命令”窗口中显示此扩展的一些帮助文本。

DLL

Exts.dll

其他信息

有关可显示关键节信息的其他命令和扩展,请参阅显示关键节。 有关关键节的详细信息,请参阅 Microsoft Windows SDK 文档、Windows 驱动程序工具包 (WDK) 文档以及 Mark Russinovich 和 David Solomon 编写的Microsoft Windows 内部资料

注解

!cs 扩展需要正在调试的进程和 Ntdll.dll 的完整符号(包括类型信息)。

以下示例演示了使用 !cs 的方法。 以下命令显示地址为 0x7803B0F8 的关键节相关信息,并显示其初始化堆栈跟踪。

0:001> !cs -s 0x7803B0F8
Critical section   = 0x7803B0F8 (MSVCRT!__app_type+0x4)
DebugInfo          = 0x6A262080
NOT LOCKED
LockSemaphore      = 0x0
SpinCount          = 0x0

Stack trace for DebugInfo = 0x6A262080:

0x6A2137BD: ntdll!RtlInitializeCriticalSectionAndSpinCount+0x9B
0x6A207A4C: ntdll!LdrpCallInitRoutine+0x14
0x6A205569: ntdll!LdrpRunInitializeRoutines+0x1D9
0x6A20DCE1: ntdll!LdrpInitializeProcess+0xAE5

以下命令显示 DebugInfo 位于地址 0x6A262080 的关键节相关信息。

0:001> !cs -d 0x6A262080
DebugInfo          = 0x6A262080
Critical section   = 0x7803B0F8 (MSVCRT!__app_type+0x4)
NOT LOCKED
LockSemaphore      = 0x0
SpinCount          = 0x0

以下命令显示当前进程中所有活动关键节的相关信息。

## 0:001> !cs

DebugInfo          = 0x6A261D60
Critical section   = 0x6A262820 (ntdll!RtlCriticalSectionLock+0x0)
LOCKED
LockCount          = 0x0
OwningThread       = 0x460
RecursionCount     = 0x1
LockSemaphore      = 0x0
## SpinCount          = 0x0

DebugInfo          = 0x6A261D80
Critical section   = 0x6A262580 (ntdll!DeferedCriticalSection+0x0)
NOT LOCKED
LockSemaphore      = 0x7FC
## SpinCount          = 0x0

DebugInfo          = 0x6A262600
Critical section   = 0x6A26074C (ntdll!LoaderLock+0x0)
NOT LOCKED
LockSemaphore      = 0x0
## SpinCount          = 0x0

DebugInfo          = 0x77fbde20
Critical section   = 0x77c8ba60 (GDI32!semColorSpaceCache+0x0)
LOCKED
LockCount          = 0x0
OwningThread       = 0x00000dd8
RecursionCount     = 0x1
LockSemaphore      = 0x0
## SpinCount          = 0x00000000

...

以下命令显示关键节树。

0:001> !cs -t

Tree root 00bb08c0

Level     Node       CS    Debug  InitThr EnterThr  WaitThr TryEnThr LeaveThr EnterCnt  WaitCnt
## 


    0 00bb08c0 77c7e020 77fbcae0      4c8      4c8        0        0      4c8        c        0
 1 00dd6fd0 0148cfe8 01683fe0      4c8      4c8        0        0      4c8        2        0
 2 00bb0aa0 008e8b84 77fbcc20      4c8        0        0        0        0        0        0
    3 00bb09e0 008e8704 77fbcba0      4c8        0        0        0        0        0        0
    4 00bb0a40 008e8944 77fbcbe0      4c8        0        0        0        0        0        0
    5 00bb0a10 008e8824 77fbcbc0      4c8        0        0        0        0        0        0
    5 00bb0a70 008e8a64 77fbcc00      4c8        0        0        0        0        0        0
    3 00bb0b00 008e8dc4 77fbcc60      4c8        0        0        0        0        0        0
    4 00bb0ad0 008e8ca4 77fbcc40      4c8        0        0        0        0        0        0
    4 00bb0b30 008e8ee4 77fbcc80      4c8        0        0        0        0        0        0
    5 00dd4fd0 0148afe4 0167ffe0      4c8        0        0        0        0        0        0
    2 00bb0e90 77c2da98 00908fe0      4c8      4c8        0        0      4c8       3a        0
 3 00bb0d70 77c2da08 008fcfe0      4c8        0        0        0        0        0        0

以下项目出现在该 !cs -t 显示中:

  • InitThr 是初始化 CS 的线程的线程 ID。

  • EnterThr 是上次调用 EnterCriticalSection 的线程的 ID。

  • WaitThr 是上次找到另一个线程拥有并等待它的关键节的线程的 ID。

  • TryEnThr 是上次调用 TryEnterCriticalSection 的线程的 ID。

  • LeaveThr 是上次调用 LeaveCriticalSection 的线程的 ID。

  • EnterCnt EnterCriticalSection 的计数。

  • WaitCnt 是争用计数。

另请参阅

!ntsdexts.locks

显示关键节

关键节超时(用户模式)