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

时间:2018-10-10 03:29:36

标签: c++ linux gdb gdbserver

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

我能够成功做到这一点,这使我可以在命令行上进行调试会话:

目标:

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的{​​{1}}前端工具?

我尝试使用的任何工具,我相信无论它使用什么基础gdb可执行文件,都会由于体系结构不匹配而出现此错误:

gdb-multiarch

更新1-

我可以使用 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 工具使它工作:

ddd

但是!这是古老的越野车,现在我无法在已加载的.so中设置断点。

我尝试了ddd --eval-command="target remote $MY_TARGET_IP:9091" --debugger gdb-multiarch及其选项来指定调试器,但目前也无法正常工作。我在此处提交了功能请求报告:

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

1 个答案:

答案 0 :(得分:2)

我找到了使用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上运行,因此我必须在configure中说target=arm-linux-gnuabi。 GDB正在为我的PC x86架构构建,但是它知道在调试时将目标识别为ARM!

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

使用此方法,我能够构建名为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更好。