開發出來應用程序突然間卡死不動,如果其中是因為死鎖問題卡列該如何排查
下面是一個簡單的死鎖例子
#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
看看調用堆棧
找到問題源碼
現在可以分析代碼了