如何在GDB中获取所有线程的回溯信息?

232

GDB中是否有与WinDbg的!process 0 7相当的命令?

我想在GDB中提取转储文件中的所有线程以及它们的回溯信息。 info threads没有输出堆栈跟踪信息。所以,是否有一条命令可以做到这一点?


17
LLDB 的相应命令是 bt all —— 以防有人通过谷歌发现这个(以为 GDB == LLDB)。 - kennytm
使用Python,以下代码可以正常工作: (gdb) python for thread in gdb.selected_inferior().threads(): thread.switch(); print(thread.num);gdb.execute('where') - Talespin_Kit
@kennytm 这个我认为已经足够好了,可以放在一个问题中。 - Bruno Alexandre Rosa
事实上,我创建了精确的问题:https://dev59.com/NsDqa4cB1Zd3GeqPou8- - Bruno Alexandre Rosa
4个回答

389

一般情况下,回溯用于获取当前线程的堆栈信息,但如果需要获取所有线程的堆栈跟踪信息,则使用以下命令。

thread apply all bt

21
将输出保存到文件中:gdb <binary> <coredump> -ex "thread apply all bt" -ex "quit" > output.log - Doomsday
10
你可以将其简写为“taabt”。 - qbolec
6
@Doomsday评论中的命令在我的电脑上卡住了。最好尝试使用gdb <binary> <coredump> -ex "thread apply all bt" -ex "detach" -ex "quit" > output.log,以避免gdb弹出等待输入的问题阻塞命令。 - Mariano Paniga
更通用的语法是 thread apply [threadno] [all] args,其中 [threadno] 也可以是空格分隔的线程标识符列表(例如 2 3 4),或者是一个范围(例如 2-6)。 - nnunes
请使用--batch或@MarianoPaniga。 - Stephane Chazelas

71

有没有一个命令可以做到这一点?

thread apply all where

8
"backtrace" 的同义词。 - erik258
1
刚试了一下,这不是backtrace的同义词。 - Vipin
1
info gdb where名称'where'和'info stack'(缩写为'info s')是'backtrace'的其他别名。 - Stephane Chazelas

20

在使用多个线程进行调试时,将GDB切换到特定的线程号,并且仅获取该线程的回溯信息也是很有用的。

详见GNU GDB 文档

GDB为您程序中的每个线程关联了自己的线程数--一个小整数按照线程创建顺序分配。

使用方法:

info threads

然后找出您想查看的线程。

thread <thread_id>

最后,仅针对该线程使用回溯(backtrace):

bt

-2

如果您的进程正在运行:

pstack $pid

你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接