如何在带有 gdb GUI 前端的 ARM gdbserver 的 PC 上执行远程 gdb 会话?
How do I perform a remote gdb session on a PC for ARM gdbserver WITH GDB GUI frontend?
我在x86_64工作站上使用Ubuntu 16.04,我正在交叉编译C++的小型演示程序,并将其部署到运行ARM架构的嵌入式Linux目标(environment-setup-cortexa9hf-neon-poky-linux-gnueabi
,arm-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-multiarch
gdb
前端工具?
我尝试的任何工具,我相信无论它使用什么基本 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 要好得多。
- 如何在带有 gdb GUI 前端的 ARM gdbserver 的 PC 上执行远程 gdb 会话?
- GDB 启动但不逐行执行
- 如何在启动过程中崩溃时使用 gdb 调试可执行文件
- 如何在标准库C/C++函数中进行gdb单步执行操作
- GDB错误不以可执行格式:未识别的文件格式
- GDB执行时,Apache IGNITE C 客户端应用程序具有许多细分故障
- gdb 7.5.1调试通过g 4.7.2构建的可执行文件的问题
- GDB 逐步执行中显示的未知代码
- GDB 在单步执行单例的静态方法时没有显示这一点?
- 使用 Linux Eclipse,我可以以编程方式判断我正在调试器 (gdb) 中执行
- 如何在执行 gdb 时插入断点
- 使用小型转储和 GDB 分析崩溃,以便 mingw 编译的可执行文件
- 有没有办法让 GDB 打印一些东西来告诉我一行已经执行,而不会停止
- 如何在 gdb 中执行步骤并同时显示该行的输出
- 在单步执行 std::function 调用时,如何跳过 std 命名空间中的方法调用?(使用 GDB
- 在 GDB 中调试多线程服务器 - 查找每个线程的状态.执行时继续并停止
- GDB 会自动单步执行内联函数
- 放置由 GDB 执行的代码
- GDB 不会执行二进制操作
- gdb执行同一语句两次