windbg cs
!cs 扩展显示一个或多个临界区(critical section)或者整个临界区树
!cs Address 指定要显示的临界区地址。如果省略该参数,调试器显示当前进程中所有临界区。
0:003> !cs 00403370 ----------------------------------------- Critical section = 0x00403370 (test2+0x3370) DebugInfo = 0x7c99e9e0 LOCKED LockCount = 0x1 OwningThread = 0x0000185c RecursionCount = 0x1 LockSemaphore = 0x2C SpinCount = 0x00000000
这里LockCount为1意思为除了一个线程拥有它外,另外还有一个线程在等待它,它是由EnterCriticalSection增加,LeaveCriticalSection来减小的,如果临界区是有信号的,则显示NOT LOCKED(值为-1)。
OwningThread表示拥有这个临界区的线程ID,RecursionCount表示拥有线程调了几次EnterCriticalSection,这其实也影响到了LockCount,如果拥有线程多调用一次EnterCriticalSection,那么 LockCount也会相应加1,因为LockCount标识了任意线程调用EnterCriticalSection请求这个互斥量的次数减1,(所以0-1=-1为NOT LOCKED)当然,前面如果调用了LeaveCriticalSection,那么 LockCount也会相应减1。
!cs -s 如果可能的话,显示每个临界区的初始堆栈回溯。!cs -l 仅显示锁定的临界区。!cs -o 对所有显示出来的已锁定的临界区,显示所有者的堆栈。