【操作系统】GDB 精确定位死锁位置技巧

GDB精确定位死锁位置技巧、竞争资源待获取方以及已占有方信息

在 gdb 中,可以使用 info threads 命令查看当前进程中所有线程的信息,包括线程 ID、状态、调用栈等信息。通过查看线程的调用栈,可以得知当前线程正在等待哪个互斥锁。

具体步骤如下:

  1. 在 gdb 中设置断点,以便在程序停下来时查看线程信息。例如,可以使用 break 命令设置断点:

    (gdb) break file.c:10
    

    在上面的命令中,file.c:10 表示在文件 file.c 的第 10 行设置断点。

  2. 运行程序,使其停在断点处。

  3. 使用 info threads 命令查看当前进程中所有线程的信息。例如,可以使用如下的命令:

    (gdb) info threads
    

    在上面的命令中,info threads 表示要查看线程信息。

  4. 找到当前正在运行的线程,并查看其调用栈。例如,假设当前正在运行的线程 ID 为 3,可以使用如下的命令查看线程 3 的调用栈:

    (gdb) thread 3
    (gdb) where
    

    在上面的命令中,thread 3 表示切换到线程 3,where 表示查看线程 3 的调用栈。

  5. 查看调用栈中是否有 pthread_mutex_lock 函数的调用。如果有,可以查看其参数,即可得知当前线程正在等待哪个互斥锁。例如,假设调用栈中有如下的函数调用:

    #0  0x00007ffff7bcf6db in poll () from /lib64/libc.so.6
    #1  0x00007ffff7b5d8c6 in epoll_wait () from /lib64/libc.so.6
    #2  0x00007ffff7d3d7f7 in ?? () from /lib64/libpthread.so.0
    #3  0x00007ffff7d3c2e3 in pthread_mutex_lock () from /lib64/libpthread.so.0
    #4  0x00000000004005f6 in thread_func (arg=0x0) at file.c:20
    

    在上面的调用栈中,第 4 行是 pthread_mutex_lock 函数的调用,可以查看其参数,即可得知当前线程正在等待哪个互斥锁。

需要注意的是,如果程序中有多个线程同时等待同一个互斥锁,那么通过查看调用栈可能无法确定当前线程正在等待哪个互斥锁。此时,可以通过查看互斥锁的地址,以及在其他线程中调用 pthread_mutex_lock 函数时打印的互斥锁地址,来确定当前线程正在等待哪个互斥锁。

实战图

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值