开发出来应用程序突然间卡死不动,如果其中是因为死锁问题卡列该如何排查
下面是一个简单的死锁例子
#include <iostream>
#include <thread>
#include <mutex>std::mutex a, b;void function_a() {std::lock_guard<std::mutex> _x(a);std::this_thread::sleep_for(std::chrono::milliseconds(500));std::lock_guard<std::mutex> _y(b);
}void function_b() {std::lock_guard<std::mutex> _y(b);std::lock_guard<std::mutex> _x(a);
}int main() {std::thread t1(function_a);std::thread t2(function_b);t1.join();t2.join();return 0;
}
以Debug模式编译运行后,毫无意外的没反应了。
现在打开任务管理器,找到进程
CPU利用率0,显然不太会有死循环,右键"转到详细信息",然后"分析等待链"。
线程18208 在等待11188结束,线程11188 卡住了。
现在可以打开WinDbg,Attach 到目录进程,在这之前要设置好符号目录,这些步骤就跳过。
现在直接!threads
查看有哪些线程
计算下11188 是哪一条
切换到2bb4
看看调用堆栈
找到问题源码
现在可以分析代码了