Windbg命令“!locks”无法工作,我还能获取信息吗?

5

在调试转储文件时,我经常需要检查锁定情况,为此我使用 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命令的情况下读取它...)


你可以尝试使用 !cs -s -l -o,但可能会看到相同的结果,你可能需要使用标志 !gflag +ust 启用用户模式堆栈跟踪。 - EdChum
1个回答

4
更好的替代方法是使用!cs -s -l -o,而不是!locks。请参见!cs,它将显示所有锁定的关键部分、所有者堆栈跟踪和关键部分堆栈跟踪。如果您想要所有关键部分,则可以省略-l。您可能需要使用gflags启用用户模式堆栈跟踪:!gflag +ust,记得在不需要时删除它:!glag -ust
如果您有地址,请执行以下操作以显示关键部分信息:https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/displaying-a-critical-section
因此,如果您有地址,!critsec ADDRESS 或使用显示类型命令 dt dt RTL_CRITICAL_SECTION ADDRESS 将起作用。

谢谢。实际上,!cs -l 更接近于 !locks,然后你可以用任何选项显示调用堆栈。 - GBrookman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接