c++ - 多线程应用程序在 WinDbg 中运行 !ntsdexts.locks 时仅显示一个线程。如何知道其他线程导致死锁?

标签 c++ windows multithreading deadlock windbg

我正在尝试使用 windbg 调试多线程应用程序死锁。
当我在 windbg 中运行 !ntsdexts.locks 命令时,它只显示一个线程作为输出。
我怎样才能找到阻塞它的其他线程?

我没有得到任何关于调试哪个部分的提示!

0:027> !ntsdexts.locks

CritSec +6ec98b00 at 000001cc6ec98b00
WaiterWoken        No
LockCount          2
RecursionCount     1
OwningThread       277c
EntryCount         0
ContentionCount    18
*** Locked

Scanned 13 critical sections

最佳答案

该命令为您提供临界区和所属线程,即 277c

您现在需要找出该线程正在做什么。从 ~~[277c]s 开始,查看调用堆栈。它可能只是处于无限循环中,但也可能处于 WaitForSingleObject()WaitForMultipleObjects() 调用中。

获取作为参数传递给任一 Wait...() 函数的参数,并查看该线程正在等待什么。可能是另一个关键部分,但可能是一些不同的同步对象。试着找出谁是那东西的主人。

继续这样,直到您回到线程 277c 并且您已确认死锁链。

这种手动方法可能非常乏味。您可能想尝试一些自动化分析:

  • !analyze -hang 可以提供有用的见解
  • !sosex.dlk 可以只分析关键部分之间的死锁,但是很完整(你得到了所有需要的信息)
  • 使用Debug Diag Hang Analysis

关于c++ - 多线程应用程序在 WinDbg 中运行 !ntsdexts.locks 时仅显示一个线程。如何知道其他线程导致死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55948178/

相关文章:

c++ - 将 std::array 转换为 std::vector

c++ - 创建阻塞队列

c++ - 双向链表插入方法实现-搜索什么节点

c++ - (C++) K-Means 聚类问题

android - 我如何在 Windows 上处理这个 python 文件?

c# - 在没有 WMI 的情况下使用 C# 检测 Windows 进程启动和退出事件

c++ - 如何获取进程的主线程 ID(通过其 ID 知道)?

Java Swing 线程改变 UI - 并发症

使用 Process.waitFor() 和 java.lang.InterruptedException 的 java 多线程

c++ - 将 QAbstractTableModel 与 QML TableView 连接起来