!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 是争用计数。
另请参阅
关键节超时(用户模式)