gdb server简单探索

news/2025/3/29 19:26:32/

前言

gdb server运行于嵌入式设备,比如arm或arm64体系结构,体积小,占用资源少,相当于一个前端。gdb server可以attach到一个strip的进程。
gdb运行于性能更高的主机,如x86设备上,需要有带符号表的相应进程。
以下分别以aarch64和x86来指带被调试进程运行设备(也就gdbserver运行设备)和gdb运行的设备。

关于gdb编译参数–target

我是使用ubuntu docker编译的gdb和gdb server,之前去简单看了下gdb的官方文档,不过也没咋看明白,之前在automake中文手册中提到过–target=target选项,我一直以为这个只有在交叉编译编译器的时候才会用到,但编译gdb时也用到了。
首先确认一下,需要编译的至少有两个进程,gdb与gdbserver,分别运行于x86和arm平台,gdbserver运行于进程真正运行的设备上,毫无疑问,指定–host=aarch64就可以了。
而gdb需要怎么编译呢?若指定–host=aarch64,则变成了arm平台的程序,但是若不指定host,那么变成了x86平台的普通gdb了,经过亲身实践,不带参数指定编译完的gdb在远程连接gdbserver后是不能正常调试的。
但是当使用同一源码编译gdb时携带–target=aarch64,则可以正常调试。
这里引用一句话:

target:表示需要处理的目标平台名称,若无指定使用 host 相同名称,gcc、binutils, gdb
等与平台指令相关的软件都有此参数,多数软件此参数无用处。

因此之前对target参数的理解可能偏狭隘,target参数不只是给编译器用的,指明编译出的编译器编译出的程序运行的平台,而是编译出的程序需要处理的目标的平台。
还有一个有意思的地方是这两种参数编译出来的产物也不同,如果指定了host(交叉编译),那么产物是gcore gdb gdb-add-index gdbserver run,而指定target,产物是gdb gdb-add-index run,少了gcore和gdbserver。

编译

具体编译过程可参照Building GDB and GDBserver for cross debugging。
编译过程还好,可能问题都是由于我这个ubuntu是被简化过的,过程中有不报不支持c++11,实际上是g++没安。
一个编译gdb常见的问题可能是缺少libtermcap库,实际这个库很老了,之前编译也不好编,只能编出静态库,而且指定了也不好用,可以去下载ncurses源码,交叉编译使用之。
还有就是报缺少gmp,我当时用apt在装,可能是脑子不清醒了,实际交叉编译缺库,安装自己平台的库是没用的,因此去下载了gmp源码交叉编译,指定-I和-L就可以了。
最后把编译好的gdbserver拷贝到arm设备就可以了。
如果只编译嵌入式设备的gdbserver的话应该不需要额外的库,看编译完的依赖:

Tag        Type                         Name/Value0x0000000000000001 (NEEDED)             Shared library: [libdl.so.2]0x0000000000000001 (NEEDED)             Shared library: [libstdc++.so.6]0x0000000000000001 (NEEDED)             Shared library: [libgcc_s.so.1]0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]0x0000000000000001 (NEEDED)             Shared library: [ld-linux-aarch64.so.1]

很明显是不需要 额外库的。看了本节开头的链接后,编译gdbserver只需要:

 ../configure --host=aarch64-linux-gnu --prefix=/opt/linkcopy/ CPPFLAGS="-Wno-error"
make -j4 all-gdbserver

跟本不需要去交叉编译那些库。
使用源码包版本记录,全部下载于http://ftp.gnu.org
gdb-12.1.tar.gz
gmp-6.2.1.tar.xz
ncurses-6.4.tar.gz

连接

arm设备:
先编个程序:

pi@link:~/project$ cat test.cpp
#include<iostream>
using namespace std;
int main()
{cout<<"hello world!"<<std::endl;
}
pi@link:~/project$g++ -g  -O2 test.cpp

然后做个strip的版本,把原版拷贝到x86设备,然后运行

gdbserver link.local:6000 a_strip.out

x86设备:

 /opt/bentutucopy/bin/aarch64-linux-gnu-gdb a.out

之后在gdb里执行:

(gdb) target remote link.local:6000

然后这两个就连上了,可以开始使用了。

使用

1)远程获取/上传/删除文件

remote get/put/delete命令
get
这样在测试的时候,在嵌入式设备上编译的带符号表版本的进程可以直接下载到本地设备。

2)运行进程

  1. 用gdbserver attach已经运行的进程
  2. 运行时命令行指定要调试的进程,然后用gdb连接后运行continue(不让运行run)。
  3. 不指定任何进程启动gdbserver:$ gdbserver --multi localhost:6000,然后在gdb指定要调试的进程,但客户端必须要用target extended-remote命令连接。连接后使用set remote exec-file a.out指定要调试进程的名字,然后就可以运行run了。需要注意的是以–multi启动的gdbserver不会主动退出,需要在gdb端连接后使用monitor exit显式退出,除非一种情况,在启动gdbserver时还指定了–onece。

http://www.ppmy.cn/news/58507.html

相关文章

2023-04-30 LeetCode每日一题(移动石子直到连续)

2023-04-30每日一题 一、题目编号 1033. 移动石子直到连续二、题目链接 点击跳转到题目位置 三、题目描述 三枚石子放置在数轴上&#xff0c;位置分别为 a&#xff0c;b&#xff0c;c。 每一回合&#xff0c;你可以从两端之一拿起一枚石子&#xff08;位置最大或最小&…

21.面向削峰填谷的电动汽车多目标优化调度策略

说明书 MATLAB代码&#xff1a;面向削峰填谷的电动汽车多目标优化调度策略 关键词&#xff1a;电动汽车 削峰填谷 多目标 充放电优化 参考文档&#xff1a;店主自己整理的说明文档&#xff0c;公式、约束、数据齐全&#xff0c;可联系我查看 仿真平台&#xff1a;MATLAB YA…

Ubantu docker学习笔记(八)私有仓库

文章目录 一、建立HTTPS链接1.在仓库服务器上获取TLS证书1.1 生成证书颁发机构证书1.2 生成服务器证书1.3 利用证书运行仓库容器 2.让私有仓库支持HTTPS3.客户端端配置 二、基本身份验证三、对外隐藏仓库服务器3.1 在服务器端3.2 在客户端进行 四、仓库可视化 在前面的学习中&a…

C语言函数声明以及函数原型

所谓声明&#xff08;Declaration&#xff09;&#xff0c;就是告诉编译器我要使用这个函数&#xff1b; 函数声明的格式&#xff0c;是去掉函数定义中的函数体&#xff0c;并在最后加上分号; 也可以不写形参&#xff0c;只写数据类型&#xff1a; dataType functionName( d…

JSP+Struct+MySql基于BBS管理系统设计与实现(源代码+论文+中英资料+开题报告+答辩PPT)

现今的社会是一个信息飞速发达的社会&#xff0c;其中在信息的交流当中&#xff0c;互联网占据着一个非常重要的位置。人们可以通过在互联网上收到最新的消息&#xff0c;也可以通过互联网进行信息的交流。而论坛就是大家进行信息交流的其中一个渠道。 论坛的概念&#xff1a;论…

【前端面经】vue-Vue的Diff算法

什么是Diff算法&#xff1f; Diff算法是Vue.js的一个核心特性&#xff0c;它是一种用于比较虚拟DOM树的差异&#xff0c;并最小化DOM操作的数量。当Vue.js检测到数据更改时&#xff0c;它会生成一个新的虚拟DOM树&#xff0c;并将其与旧虚拟DOM树进行比较。Diff算法会查找差异…

【Python习题集6】类与对象

类与对象 一、实验内容二、实验总结 一、实验内容 1.设计一个Circle类来表示圆&#xff0c;这个类包含圆的半径以及求面积和周长的函数。在使用这个类创建半径为1~10的圆&#xff0c;并计算出相应的面积和周长。 半径为1的圆&#xff0c;面积: 3.14 周长: 6.28 半径为2的圆&am…

Android 9.0 设置静态ip重启后获取不到ip的修复

1.概述 在9.0的系统rom定制化开发中,在一些产品开发中,在对于设置静态ip以后可以正常使用, 但是遇到一个新问题 就是开机以后,获取不到ip,地址,这就有点不正常了, 获取不到ip 就自然连不上网了,所以要分析问题所在解决问题 2.设置静态ip重启后获取不到ip的修复的核心…