开发出来应用程序突然间卡死不动,如果其中是因为死锁问题卡列该如何排查
下面是一个简单的死锁例子
cpp
#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
看看调用堆栈
找到问题源码
现在可以分析代码了