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)

posted @ 2022-04-20 07:37  ho966  阅读(251)  评论(0编辑  收藏  举报