代码之家  ›  专栏  ›  技术社区  ›  Mark P Neyer

GDB可以显示每个线程所持有的pthread互斥体的列表吗?

  •  3
  • Mark P Neyer  · 技术社区  · 14 年前

    3 回复  |  直到 14 年前
        1
  •  3
  •   Jeremy W. Sherman    14 年前

    您应该询问的不是GDB,而是您正在使用的特定pthread库和操作系统。

    pthread库通过一组系统调用与内核协作实现互斥锁。如果它的互斥锁实现嵌入了一些东西来将持有互斥锁的最后一个线程绑定到互斥锁数据结构中,那么可以使用GDB获取该信息。

    kgmacros ,包括命令 showallmtx 你想干什么就干什么。注意:要使用它,您必须在当时调试机器的内核,这意味着您需要使用不同的机器进行调试。

    /dev/kmem 设备文件,它可以让你在内核的内存中寻找并访问必要的数据结构,只要你能找到它。

    但这一切都取决于你的系统-你的pthread库和操作系统内核-而不是GDB。

    您还可以尝试创建类型为 PTHREAD_MUTEX_ERRORCHECK pthread_mutex_lock() 返回 EDEADLK 而不是死锁。然后,您可以在发生这种情况时中断,并在您的非死锁进程中扎根。

        2
  •  5
  •   michael    12 年前

    在至少一种Linux的味道上,C++ 11 STD::互斥体有一个名为“y-Ox所有者”的成员,它包含当前具有互斥锁的线程的线程ID。在gdb中使用“info threads”显示gdb使用的线程号和线程id(参见“LWP”号),允许您切换到该线程(“thread N”),然后检查调用堆栈(“backtrace”)。

        3
  •  2
  •   alanc    12 年前

    GDB公司 能够显示此信息,但它们没有实现此功能:它需要调试器和线程库之间的合作,尽管 libthread_db 图书馆。

    feature (寻找 部分)