c++ - Windbg "!locks"命令不起作用,我还能获取信息吗?

标签 c++ multithreading debugging windbg locks

在调试转储文件时,我需要定期检查锁,为此我使用了 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

是否有可能获得一些信息? (例如,关键部分调试信息在哪里,如果没有 !locks 命令,我如何读取它,...)

最佳答案

!locks 的更好替代方法是使用 !cs -s -l -o 参见 !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 将在您有地址的情况下起作用。

关于c++ - Windbg "!locks"命令不起作用,我还能获取信息吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53848511/

相关文章:

C++ 生成下一个 key

c++ - 创建的窗口没有标题

java - 在java中同时访问 volatile 变量

c++ - 有没有办法让一个类的每个对象都有一个提升线程?

Eclipse 中的 Android NDK 调试 - 如何停止仅在步入 native 代码时发生的段错误/SIGILL

java - 在 Eclipse 的 Debug模式下动态执行命令/代码

c++ - Arduino 静态变量声明没有数据类型?

c++ - 为什么这个变量需要是静态的?

java - 如何在java中同步静态方法

javascript - 我可以在 chrome 开发工具中模拟我的请求响应吗?