Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用gdb查找线程树?_C++_Multithreading_Gdb - Fatal编程技术网

C++ 如何使用gdb查找线程树?

C++ 如何使用gdb查找线程树?,c++,multithreading,gdb,C++,Multithreading,Gdb,我在网上搜索,但没有找到信息线程提供与gdb连接的进程中当前处于活动状态的所有线程。我想知道gdb是否可以显示线程树,即列出的线程之间的父子关系 为什么我想知道呢?:在十几个线程中,有一个线程正在等待其子线程的join_all()。如果我能理解哪些线程是等待的主线程,我就能更好地调试 元数据: gdbversion7.7试着运行这个程序,以获得所有线程的良好视图,从而查看它们在做什么。这可能比从一个线程树中找出更容易: thread apply all bt 这将为您生成所有线程的回溯,然后您

我在网上搜索,但没有找到<代码>信息线程提供与gdb连接的进程中当前处于活动状态的所有线程。我想知道gdb是否可以显示线程树,即列出的线程之间的父子关系

为什么我想知道呢?:在十几个线程中,有一个线程正在等待其子线程的join_all()。如果我能理解哪些线程是等待的主线程,我就能更好地调试

元数据:
gdbversion7.7

试着运行这个程序,以获得所有线程的良好视图,从而查看它们在做什么。这可能比从一个线程树中找出更容易:

thread apply all bt

这将为您生成所有线程的回溯,然后您可以直观地看到谁在等待什么。

我认为您想要的信息不可用,因此gdb没有内置的显示方式

如果这是非常重要的,我想你有几个选择

第一,在你的后续评论中,你提到一个线程正试图加入它的子线程。因此,作为一个快速而肮脏的东西,您可以切换到该线程,转到“上”,并查看它正在等待的线程


或者,您可以使用Python编写一些gdb代码以某种方式实现自动化,可以是特定于应用程序的,也可以是通过在适当的位置(pthread_create等)设置断点来记录父代信息。这有点难。

我最近想要这个信息,并制定了以下计划。它并不漂亮,但它会打印所有线程之间的父/子关系

启动gdb后但在运行程序之前,请粘贴以下gdb命令:

set pagination off
break pthread_create
commands
set $a = newthread
continue
end
break pthread_create.c:611
commands
p "parent thread"
p/x pthread_self()
p "child thread"
p/x *$a
p "created from this stack"
where
continue
end
然后运行你的程序

当您遇到崩溃或希望查看线程时,可以使用“info threads”列出所有当前线程,或使用“thread”打印有关当前线程的信息。然后可以向上滚动断点的所有输出,以查看线程之间的父/子关系。这还包括每个线程创建的堆栈跟踪,这比简单的线程ID树更有用

我将整个gdb会话文本复制到emacs并搜索匹配的线程ID,而不是手动向后滚动并查找ID

第一个断点是对pthread_create的调用。这发生在父线程中。pthread_create()的第一个参数(“newthread”)是指向子线程ID所在位置的指针。当第一个断点被命中时,我们将该指针保存在$a中。然后我们需要继续执行,直到第二个断点,此时指针的目标将被子线程ID填充


这是在Ubuntu14.04Linux上。如果您的库版本差异很大,则第二个断点(位于pthread_create.c:611)可能需要更改。我实验性地找到了行号,第一个断点没有“commands”部分,然后键入“until”和“print*$a”,直到它被孩子的线程ID填满。

谢谢你的回复。不幸的是,回溯所有线程并不能提供一个清晰的画面,因此不能帮助我进一步调试。线程树或类似的替代方法可以帮助我更好地理解线程之间的关系。你能详细说明“并查看它正在等待的线程”吗。我该怎么做呢?我想这取决于你的程序。从下面的答案来看,gdb显然不支持线程树或任何类似的东西;它必须手动完成。谢谢大家花时间研究这个问题。我在ubuntu 16.04.2上使用了这个技术,发现第二个断点应该在pthread_create.c:633。