Поделиться через


!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 Отображает стек владельца для любого заблокированного критического раздела, отображаемого.
Адрес Указывает адрес отображаемого критического раздела. Если этот параметр не указан, отладчик отображает все критические разделы в текущем процессе.
StartAddress Указывает начало диапазона адресов для поиска критически важных разделов.
EndAddress Указывает конец диапазона адресов для поиска критически важных разделов.
-d Отображает критические разделы, связанные с DebugInfo.
InfoAddress Указывает адрес DebugInfo.
-t Отображает дерево критически важных разделов. Прежде чем использовать параметр -t , необходимо активировать средство проверки приложений для целевого процесса и выбрать параметр "Проверить использование блокировки".
TreeAddress Указывает адрес корневого дерева критически важных разделов. Если этот параметр опущен или указать ноль, отладчик отображает дерево критически важных разделов для текущего процесса.
-? Отображает текст справки для этого расширения в окне команды отладчика.

DLL-библиотеки

Exts.dll

Дополнительная информация

Другие команды и расширения, которые могут отображать критически важные сведения о разделе, см. в разделе "Отображение критического раздела". Дополнительные сведения о критически важных разделах см. в документации по пакету SDK для Microsoft Windows, документации по комплекту драйверов Windows (WDK) и внутренним службам 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.

  • EnterThr — это идентификатор потока, который в последний раз вызывал ВводCriticalSection .

  • WaitThr — это идентификатор потока, который нашел критически важный раздел, принадлежащий другому потоку, и ждал его в последний раз.

  • TryEnThr — это идентификатор потока, который в последний раз вызывал TryEnterCriticalSection .

  • LeaveThr — это идентификатор потока, который в последний раз называется LeaveCriticalSection

  • EnterCnt — это число enterCriticalSection.

  • WaitCnt — это количество спорных запросов.

См. также

!ntsdexts.locks

Отображение критического раздела

Критические истечение времени ожидания разделов (режим пользователя)