远程GDB调试

15
我刚刚花了一整天的时间试图找到一种方法,从Qt Creator或Eclipse启用GDB调试。我了解到基本上有两种方法来启动目标应用程序:
  • 使用ssh (ssh host gdb)
  • 使用gdbserver
我能够使用这两种方法远程启动gdb并启动应用程序。然而,GDB从未响应IDE中设置的任何断点。另外,我无法暂停应用程序以检查程序状态。在Qt Creator中,我只得到一个晦涩的堆栈跟踪(实际上可能是ssh或gdb的跟踪...)。
有人能帮我入门吗?

进展!

我发现在Qt Creator 2.0中有一个名为“附加和调试远程应用程序”的功能。它基于gdbserver。好处是它会停在IDE的断点上。但是,有两个问题:
  • 当它遇到断点时,它只显示汇编代码,而不是源代码。
  • GDB经常因为“接收到信号”而退出
我应该提到,远程可执行文件是使用比我本地PC上安装的版本较旧的GCC编译的。也许其中一些问题与此有关。

更新

我应该提到,我通过SSH在远程计算机上切换到运行cgdb
远程Qt Creator解决方案不稳定。GDB倾向于因神秘的“接收到信号”消息而退出。

1
使用--annotate=1参数运行gdb可能有助于解决您的源代码问题。此外,请确保使用调试符号(在gcc中为-g)进行编译。 - nmichaels
@Nathon:谢谢,我尝试使用annotate=1,但似乎没有任何区别。 - StackedCrooked
你应该能够通过告诉它如何处理信号来停止它的停止。格式为 handle <SIGNAL> [no]stop [no]print [no]pass。信号名称区分大小写的,即需要大写字母。 - OJFord
2个回答

8
为了使您的主机上的GDB(即您开发和编译的计算机,也是Qt Creator所在的位置)能够访问“符号文件”,您需要授权给它访问权限。
我通常不使用Qt Creator,而是直接使用GDB和gdbserver进行远程调试交叉编译程序。您可以尝试一下,确保这对您有效,然后再查找Qt Creator中缺失的选项(或者这可能会帮助您找到缺失的选项)。
在目标机器上运行:
gdbserver :5000 yourprogram

在主机上,运行gdb,然后加载符号文件:
(gdb) symbol-file yourprogram

在主机上使用GDB,您需要连接到远程gdbserver:
(gdb) target remote target_ip_address:5000

从此,您可以在主机上使用GDB来控制目标程序。

希望这能帮到您!


我必须传递给QtCreator之一的参数是可执行文件的本地副本。如果使用调试选项(-ggdb)编译,它会嵌入符号,这样想对吗? - StackedCrooked
是的,调试符号应该使用-ggdb选项包含在内。我通常使用通用的-g选项,但-ggdb似乎更好(它会生成额外的调试信息以供gdb使用)。可能是因为您的目标上没有安装库的调试版本? - Longfield

3
由于我们的makefile构建系统的特殊性,调试符号中包含的文件引用看起来像这样:
../src/main.cpp
../../src/utils/logger.cpp

对于GDB来说,这不是问题,但Qt Creator无法将这些路径映射到实际文件。我通过在GDB init文件中添加'dir'语句来解决了这个问题:

dir src
dir src/utils
...

现在它已经可以工作了。

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