如何在GDB中调试多线程代码?

3

我正在尝试调试一个多线程程序,其中一个线程等待用户输入。当我在其他线程的某个函数处设置断点并运行应用程序时,它会切换到同一个断点,然后立即进入输入线程,因此应用程序等待用户输入,我无法在gdb中执行任何命令。我只需要在调用相同函数之前查看所有堆栈。我无法在bt命令中进行操作。

2个回答

1

您可以在断点中添加命令,具体请参见手册。示例如下:

(gdb) break some_func
Breakpoint 2 at ...
(gdb) commands 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>thread apply all bt full
>end
(gdb) cont
Continuing.
Breakpoint 2, ...
Thread 1 (Thread 0x....
...

编辑0:

哦,我猜你在使用 gdb 时遇到了这个问题:

---Type <return> to continue, or q <return> to quit---

在执行run之前,请按照以下步骤操作(您也可以将此操作放入.gdbinit文件中):

(gdb) set pagination off

谢谢。它有效。但是,我有以下输出:断点1, ---键入<return>继续,或q<return>退出---我无法输入<return>或任何键。输入挂起了。为什么?我想在那个点继续调试。这可能吗? - Slava
end 之前添加 cont 到命令列表中,它将自动继续执行。 - Nikolai Fetissov
当gdb在断点上停止时,我无法键入“continue”。输入由于某种原因而冻结。但我想继续调试。我正在Cygwin上使用gdb。 - Slava
这就是我的意思 - 将cont添加到断点命令列表中。这样,您将在该断点处获得所有线程的完整堆栈跟踪,并自动继续执行。您还可以将gdb输出保存到文件中,请参阅手册。 - Nikolai Fetissov

1

thread apply all bt 这个命令是否解决了您的问题?


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