Windbg,怎么读!锁输出?

Nya*_*uko 4 c++ multithreading windbg

我正在调试一个程序,我怀疑可能存在死锁或其他与线程相关的bug,我按照人们的建议使用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
Run Code Online (Sandbox Code Playgroud)

我对输出感到困惑,任何人都可以帮忙解释一下吗?

小智 10

!锁可能令人困惑.如果你真的想调试死锁的情况,做了〜*KVN(或KB无论你喜欢)找到线程都在等待这将在**WaitForSingleForSingleObject结束的关键部分,并在此之前,一个RtlEnterCriticalSection电话.找到大多数线程正在关注的关键部分.转储关键部分.如果您正在调试基于x64转储和缩小到使用.frame携带RtlCrticalSection帧/ C后你是在线程上下文〜[threadnum] S,RBX将包含您的关键部分.

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

希望这可以帮助.


Kje*_*nar 6

Teb 是线程环境块的地址,暂停和冻结目前不相关

\n\n

假设它\xe2\x80\x99是一个32位场景,你可以通过以下方式揭示线程正在等待哪个关键部分:

\n\n
a) Switch to the thread\nb) dump stack\nc) Find 1 argument to RtlEnterCriticalSection\n
Run Code Online (Sandbox Code Playgroud)\n\n

(如果是 64,请按照上面 Addy 的接收)

\n\n

在此输入图像描述

\n