linux死锁问题定位
写一个死锁代码:
#include <mutex> #include <thread> #include <chrono> std::mutex s_mtx_1; std::mutex s_mtx_2; int main() { std::thread thread1([&](){ s_mtx_1.lock(); std::this_thread::sleep_for(std::chrono::milliseconds(2000)); s_mtx_2.lock();}); std::thread thread2([&](){ s_mtx_2.lock(); std::this_thread::sleep_for(std::chrono::milliseconds(2000)); s_mtx_1.lock();}); thread1.join(); thread2.join(); return 0; }
执行g++ main.cpp -lpthread -std=c++11 -g 生成可执行程序
执行程序后发现程序并没有正常退出,实际死锁了
执行 pstack PID 查看堆栈可以发现有死锁
执行 gcore PID, 生成core文件,
执行 gdb 程序名 core文件,分析堆栈
先看主线程卡在哪里
卡在了thread 1
thread 1中有把锁, 该锁的拥有者是thread 2,就是thread 2还没有释放该锁
ps:
如果没有变量信息, 可查看通过寄存器找到pthead_mutex_t对象,
x86架构下,寄存器$rdi p *(pthread_mutex_t*)$rdi 或者 p *(int*)($rdi+8)
arm架构下,寄存器$x0 p *(pthread_mutex_t*)$x0 或者 p *(int*)($x0+8)