2

我转储了一个挂起的进程,我有三个线程在等待这个:

ntdll.dll ZwWaitForKeyedEvent
ntdll.dll RtlSleepConditionVariableCS
kernel32.dll SleepConditionVariableCS
odbc32.dll EnterCancelCSAndDbcCS
odbc32.dll FreeStmt
odbc32.dll SQLFreeStmt
oqpers.dll ZED_SQLFreeStmt

有什么办法可以看到关键部分odbc32.dll?我想知道它在等待什么线程。

4

1 回答 1

0

kv输出中,您应该能够看到传递给SleepConditionVariableCS的临界区地址。然后使用该!critsec [address]命令查看当前是否有人拥有它。

但是根据上面的堆栈跟踪,线程仍然在等待条件,并且还没有尝试重新获取锁。试图找出为什么有人没有发出条件事件的信号并不是一件容易的事。

我会探索 odbc32!EnterCancelCSAndDbcCS 的参数和堆栈。从名称上看,它可能使用了两个关键部分,其中一个可能被锁定,以防止其他线程发出条件信号。

于 2013-08-14T15:28:07.770 回答