Partilhar via


!cs

A extensão !cs exibe uma ou mais seções críticas ou a árvore de seções críticas inteira.

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

Parâmetros

Parâmetro Descrição
-s Se essas informações estiverem disponíveis, exibirá o rastreamento de pilha de inicialização de cada seção crítica.
-l Exibe somente as seções críticas bloqueadas.
-o Exibe a pilha do proprietário de qualquer seção crítica bloqueada exibida.
Endereço Especifica o endereço da seção crítica a ser exibida. Caso você omita esse parâmetro, o depurador exibirá todas as seções críticas no processo atual.
StartAddress Especifica o início do intervalo de endereços para procurar seções críticas.
EndAddress Especifica o término do intervalo de endereços para procurar seções críticas.
-d Exibe seções críticas associadas a DebugInfo.
InfoAddress Especifica o endereço do DebugInfo.
-t Exibe uma árvore de seção crítica. Antes de usar a opção -t, você deve ativar o Application Verifier para o processo de destino e selecionar a opção Verificar uso de bloqueio.
TreeAddress Especifica o endereço da raiz da árvore de seção crítica. Caso você omita esse parâmetro ou especifique zero, o depurador exibirá a árvore de seção crítica do processo atual.
-? Exibe um texto de Ajuda dessa extensão na janela Comando do Depurador.

DLL

Exts.dll

Informações Adicionais

Para ver outros comandos e extensões com informações de seção crítica, confira Exibir uma seção crítica. Para saber mais sobre seções críticas, confira a documentação do SDK do Microsoft Windows, a documentação do WDK (Kit de Driver do Windows) e o Microsoft Windows Internals de Mark Russinovich e David Solomon.

Comentários

A extensão !cs exige símbolos completos (inclusive informações de tipo) do processo depurado e de Ntdll.dll.

Os exemplos a seguir indicam como usar !cs. O comando a seguir contém informações sobre a seção crítica no endereço 0x7803B0F8 e mostra o rastreamento da pilha de inicialização.

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

O comando a seguir exibe informações sobre a seção crítica cujo DebugInfo está no endereço 0x6A262080.

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

O comando a seguir exibe informações sobre todas as seções críticas ativas no processo atual.

## 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

...

O comando a seguir exibe a árvore de seção crítica.

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

Os seguintes itens aparecem nesta exibição de !cs -t:

  • InitThr é a ID do thread que inicializou o CS.

  • EnterThr é a ID do thread que chamou EnterCriticalSection pela última vez.

  • WaitThr é a ID do thread que localizou a seção crítica de outro thread e aguardou-a pela última vez.

  • TryEnThr é a ID do thread que chamou TryEnterCriticalSection pela última vez.

  • LeaveThr é a ID do thread que chamou LeaveCriticalSection pela última vez

  • EnterCnt é a contagem de EnterCriticalSection.

  • WaitCnt é a contagem de contenções.

Confira também

!ntsdexts.locks

Exibir uma seção crítica

Tempos limite da seção crítica (modo de usuário)