<格蠹汇编>_第9章_经典阅读器的经典死锁

死锁

         利用windbg的!locks来查看进程中的锁,特别是那些处于锁定状态的锁。

1
2
3
4
5
6
7
8
9
10
11
0:000> !locks
CritSec ntdll!LdrpLoaderLock+0 at 7c99b178
LockCount 0
RecursionCount 1
OwningThread 6a8
EntryCount 0
ContentionCount 0
*** Locked
Scanned 20 critical sections

         从底层来说,关键区机制主要是通过RTL_CRITICAL_SECTION结构来实现的。

1
2
3
4
5
6
7
8
9
struct RTL_CRITICAL_SECTION
{
+0x000: PRTL_CRITICAL_SECTION_DEBUG DebugInfo;
+0x004 LONG LockCount; //标志关键区的锁状态
LONG RecursionCount; //标记递归次数,用于支持同一个线程多次进入临界区
HANDLE OwningThread; //进入临界区的线程ID
HANDLE LockSemaphore; //标记临界区对应于的事件对象,如果为空,表示无线程处于等待状态
ULONG_PTR SpinCount;
};

         利用!locks是没有办法查看LockSemaphore成员的,但是可以使用!cs -l可以。

1
2
3
4
5
6
7
8
9
10
0:000> !cs -l
-----------------------------------------
DebugInfo = 0x7c99b1a0
Critical section = 0x7c99b178 (ntdll!LdrpLoaderLock+0x0)
LOCKED
LockCount = 0x0
OwningThread = 0x000006a8
RecursionCount = 0x1
LockSemaphore = 0x0 //等待对象
SpinCount = 0x00000000