我正在调试一个我怀疑可能存在死锁或其他多线程相关错误的程序,我按照人们的建议使用 WinDBG 打开故障转储文件并使用 !locks 获得以下输出:
CritSec MSVCR100D!lclcritsects+48 at 73541e40
WaiterWoken No
LockCount 6
RecursionCount 1
OwningThread 164c
EntryCount 0
ContentionCount 9
*** Locked
*** ERROR: Symbol file could not be found. Defaulted to export symbols for qsqlited4.dll -
CritSec qsqlited4!qt_plugin_instance+a1b21 at 70fc301c
WaiterWoken No
LockCount 0
RecursionCount 1
OwningThread 2344
EntryCount 0
ContentionCount 0
*** Locked
CritSec +73c2380 at 073c2380
WaiterWoken No
LockCount 0
RecursionCount 4
OwningThread 2344
EntryCount 0
ContentionCount 0
*** Locked
CritSec +73bf9e8 at 073bf9e8
WaiterWoken No
LockCount 0
RecursionCount 1
OwningThread 2344
EntryCount 0
ContentionCount 0
*** Locked
Scanned 817 critical sections
我对输出感到困惑,有人可以帮忙解释一下吗?
原文由 Nyaruko 发布,翻译遵循 CC BY-SA 4.0 许可协议
!locks 可能会令人困惑。如果您真的想调试死锁情况,请执行 ~*kvn(或您喜欢的 kb)查找等待关键部分的线程,该部分将以 **WaitForSingleObject 结束,然后是 RtlEnterCriticalSection 调用。找到大多数线程都在关注的关键部分。转储关键部分。如果您正在调试基于 x64 的转储并使用 .frame /c 缩小到带有 RtlCrticalSection 的框架,则您处于线程上下文 ~[threadnum]s 中,rbx 将包含您的关键部分。
转储关键部分找到所有者。如果所有者在等待,找出所有者在等待什么等等,直到我们到达链的末端或事情被阻止的原因。 !cs -l -o 如果我们不将它放在上下文中,可能会令人困惑。
希望这可以帮助。