如何在带有 gdb GUI 前端的 ARM gdbserver 的 PC 上执行远程 gdb 会话?

How do I perform a remote gdb session on a PC for ARM gdbserver WITH GDB GUI frontend?

本文关键字:gdb 执行 PC 会话 gdbserver ARM GUI 前端      更新时间:2023-10-16

我在x86_64工作站上使用Ubuntu 16.04,我正在交叉编译C++的小型演示程序,并将其部署到运行ARM架构的嵌入式Linux目标(environment-setup-cortexa9hf-neon-poky-linux-gnueabiarm-poky-linux-gnueabi-g++(。

我能够成功地做到这一点,这给了我在命令行上的调试会话:

目标:

rpm -ivh gdbserver-7.10.1-r0.cortexa9hf_neon.rpm
gdbserver :9091 ${APPNAME}

主机:

sudo apt-get install gdb-multiarch
gdb-multiarch $APPNAME
target remote 192.168.0.212:9091

。 我现在可以在命令行上使用 gdb-multiarch!

然而从这里...我真的希望能够使用众多gdb前端工具之一来提供 GUI 来设置断点并单步执行代码(类似于gdbgui,或使用vscode和配置调试器(。是否有任何专门支持gdb-multiarchgdb前端工具?

我尝试的任何工具,我相信无论它使用什么基本 gdb 可执行文件,并且由于不匹配的架构而出现此错误:

target remote 192.168.0.212:9091
Remote debugging using 192.168.0.212:9091
warning: Architecture rejected target-supplied description
Remote 'g' packet reply is too long: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070fdff7e00000000c0fafc76100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

更新 1 --

我可以使用ddd工具让它工作:

ddd --eval-command="target remote $MY_TARGET_IP:9091" --debugger gdb-multiarch

然而!这是古老而有缺陷的,我现在无法在加载的 .so 中设置断点。

我尝试使用其选项gdbgui指定调试器,但目前也不起作用。我在这里提交了一份功能请求报告:

https://github.com/cs01/gdbgui/issues/237

我找到了一种使用gdbgui的方法,但它需要我针对我的特定远程目标架构从源代码重建 gdb。我如何让它工作的详细信息在这里:

https://github.com/cs01/gdbgui/issues/237

如果上述链接断开,则重要位: TLDR解决方案:

我试图依赖来自ubuntu apt repos的预构建gdb-multiarch,但它不起作用。当我决定下载 gdb 并从源代码重建,同时配置 arm-linux-gnuabi 目标架构时。

构建方法:

下载最新的 GDB 源代码

解压缩它,进入文件夹,然后像这样构建它:

./configure  --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --target=arm-linux-gnuabi && make -j8 && sudo make install

重要的是要注意,对于我的特定远程 gdb 服务器,它在 ARM 上运行,所以我不得不说target=arm-linux-gnuabi配置。GDB 是为我的 PC x86 架构构建的,但它知道在调试时将目标识别为 ARM!

现在,默认情况下安装了arm-linux-gnuabi-gdb/usr/local/bin...但是,您可以在上面的脚本中提供prefix=<path>您希望它安装的位置./configure

使用它,我能够构建一个名为arm-linux-gnuabi-gdb的 gdb 辅助副本,我可以像这样提供给gdbgui

gdbgui -g arm-linux-gnuabi-gdb

从那里,我可以给出 gdb 命令来连接到我的远程 gdbserver。我必须事先设置断点。我的gdb命令是这样的,用于设置一些断点:

set breakpoint pending on
break my_object.cpp:<line number for breakpoint>
b example_function_name
target remote <remote arm machine IP>:<gdbserver port>
c

效果很好!这比在我的远程目标上在命令行上运行 gdb 要好得多。