Windbg,如何读取 !locks 输出?

新手上路,请多包涵

我正在调试一个我怀疑可能存在死锁或其他多线程相关错误的程序,我按照人们的建议使用 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 许可协议

阅读 709
1 个回答

!locks 可能会令人困惑。如果您真的想调试死锁情况,请执行 ~*kvn(或您喜欢的 kb)查找等待关键部分的线程,该部分将以 **WaitForSingleObject 结束,然后是 RtlEnterCriticalSection 调用。找到大多数线程都在关注的关键部分。转储关键部分。如果您正在调试基于 x64 的转储并使用 .frame /c 缩小到带有 RtlCrticalSection 的框架,则您处于线程上下文 ~[threadnum]s 中,rbx 将包含您的关键部分。

转储关键部分找到所有者。如果所有者在等待,找出所有者在等待什么等等,直到我们到达链的末端或事情被阻止的原因。 !cs -l -o 如果我们不将它放在上下文中,可能会令人困惑。

希望这可以帮助。

原文由 Addy 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题