!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
Tempos limite da seção crítica (modo de usuário)