Windbg“!locks”命令不起作用,我还能获取信息吗?

Windbg "!locks" command doesn't work, can I get information anyway?

调试转储文件时,我需要定期检查锁,为此我使用 windbg 扩展命令 !locks。当一切顺利时,这会提供如下输出:

CritSec +54a8a8 at 0054a8a8
WaiterWoken        No
LockCount          0
RecursionCount     1
OwningThread       13d8
EntryCount         0
ContentionCount    0
*** Locked

CritSec +b73a8d at 00135e8d
WaiterWoken        No
LockCount          0
RecursionCount     1
OwningThread       55f3
EntryCount         0
ContentionCount    0
*** Locked

...

Scanned 662 critical sections

但是,有时我会收到以下错误消息:

Stopped scanning because of problem reading critical section debug info

Scanned 7 critical sections

有没有可能得到一些信息? (例如,critical section debug info 在哪里,如果没有 !locks 命令,我如何读取它,...)

!locks 更好的替代方法是使用 !cs -s -l -o 参见 !cs 这将显示所有锁定的关键部分、所有者堆栈跟踪和关键部分堆栈跟踪,您可以省略-l 如果你想要所有关键部分。您可能需要使用 gflags 启用用户模式堆栈跟踪 !gflag +ust 记得在不需要时将其删除 !glag -ust.

要显示临界区信息,如果您有地址,您可以这样做:https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/displaying-a-critical-section

所以 !critsec ADDRESS 或者使用显示类型命令 dt dt RTL_CRITICAL_SECTION ADDRESS 如果你有地址就可以了。