gdb和gdbserver工具的使用简介与交叉编译

一,介绍

     嵌入式系统资源有限性,一般不能直目标系统上进行调试,所以很多情况下都是远程调试,就目前而言,嵌入式 Linux系统中,主要有三种远程调试方法,分别适用于不同场合的调试工作:

    a,用ROM Monitor调试目标机程序;

    b,用KGDB调试系统内核;

    c,用gdbserver调试用户空间程序。

     这三种调试方法的区别主要在于,目标机远程调试stub 的存在形式的不同,而其设计思路和实现方法则是大致相同的。
     而我们最常用的是调试应用程序,就是采用gdb+gdbserver的方式进行调试。在很多情况下,用户需要对一个应用程序进行反复调试,特别是复杂的程序。采用GDB方法调试,gdbserver在目标系统中运行,gdb则在宿主机上运行。

二,编译

2.1 跳过编译

    不愿意自己编译的,可以直接官网下载(https://packages.debian.org/buster/gdb)编译好的。我这里是debian系统,所以用的是debian官网。

gdb和gdbserver工具的使用简介与交叉编译_第1张图片

2.2 下载源码

下载链接:http://ftp.gnu.org/gnu/gdb/

2.3 解压

root@67f5f1812256:/data# tar -xvf gdb-9.1.tar.xz

2.4 编译

root@67f5f1812256:/data/gdb-9.1# mkdir build
root@67f5f1812256:/data/gdb-9.1# cd build/
 ../configure CC=aarch64-linux-gnu-gcc -host=aarch64-linux-gnu -target=aarch64-linux-gnu 
root@67f5f1812256:/data/gdb-9.1/build# make

-target=aarch64-linux-gnu表示目标平台,--host表示主机端运行的是aaarch64-linux-gnu,不需要配置--prefix,因为gdbserver不在主机端安装运行。

编译后的gdb在

root@67f5f1812256:/data/gdb-9.1/build# ls gdb/gdb
gdb/gdb

需要make install 安装一下,因为下面要在宿主机用gdb客户端。

编译后的gdbserver在

root@67f5f1812256:/data/gdb-9.1/build# ls gdb/gdbserver/gdbserver
gdb/gdbserver/gdbserver

2.5 减小文件大小,使用strip

root@67f5f1812256:/data/gdb-9.1/build# file gdb/gdb
gdb/gdb: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=9022b80cc491a86587b79d27a8165348dfd88a0e, with debug_info, not stripped
root@67f5f1812256:/data/gdb-9.1/build# aarch64-linux-gnu-strip gdb/gdb -o test_gdb
root@67f5f1812256:/data/gdb-9.1/build# file test_gdb
test_gdb: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=9022b80cc491a86587b79d27a8165348dfd88a0e, stripped
root@67f5f1812256:/data/gdb-9.1/build#
root@67f5f1812256:/data/gdb-9.1/build#
root@67f5f1812256:/data/gdb-9.1/build#
root@67f5f1812256:/data/gdb-9.1/build# file gdb/gdbserver/gdbserver
gdb/gdbserver/gdbserver: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=e2b769f9292f95603b93f7deaf41adfe91f81804, with debug_info, not stripped
root@67f5f1812256:/data/gdb-9.1/build# aarch64-linux-gnu-strip gdb/gdbserver/gdbserver -o test_gdbserver
root@67f5f1812256:/data/gdb-9.1/build# file test_gdbserver
test_gdbserver: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, for GNU/Linux 3.7.0, BuildID[sha1]=e2b769f9292f95603b93f7deaf41adfe91f81804, stripped
root@67f5f1812256:/data/gdb-9.1/build#

三,使用

3.1 目标板运行gdbserver

root@huawei:~# gdbserver 192.168.0.107:6666 test
Process /gyz/ecSmartFire created; pid = 169
Listening on port 6666

说明:
1,192.168.0.107是宿主机ip,即gdb运行的环境;
2,test为带调试-g选项的可执行程序。

等gdb也连接上后,多了一句,如下:
root@huawei:~# gdbserver 192.168.0.107:6666 test
Process /gyz/ecSmartFire created; pid = 169
Listening on port 6666
Remote debugging from host 192.168.1.107, port 58494

3.1 宿主机运行gdb

root@debian:/home/guoyanzhang/share/502H/502H/output# gdb test
...gdb提示信息
(gdb) gdb remote 192.168.1.200:6666
Remote debugging using 192.168.1.200:6666
说明:
1,192.168.1.200是目标板子的ip,即gdbserver运行的环境


四,strip简单介绍

    strip命令用于脱掉文件的衣服, 文件会变小, 其中的符号信息会失去。 那这个strip有什么用呢? 很有用的! 原来的a.out比较大, 可以执行。 在strip之后, 文件变小了, 也是可以执行, 这就节省了很多空间。其实, strip不仅仅可以针对可执行文件, 还能针对目标文件和动态库等. 在实际的开发中, 经常需要对动态库.so进行strip操作, 减少占地空间。 而在调试的时候(比如用addr2line), 就需要符号了。 因此, 通常的做法是: strip前的库用来调试, strip后的库用来实际发布, 他们两者有对应关系。 一旦发布的strip后的库出了问题, 就可以找对应的未strip的库来定位。例如某个动态库strip前是50M左右, strip后是20M左右, 可见, 脱脱衣服还是有明显好处的。我们在调试过程中, 经常涉及到上传库, 库太大时, 很耗费传输时间, 所以还是先用strip来处理一下比较好。

    strip 命令减少 XCOFF 对象文件的大小。strip 命令从 XCOFF 对象文件中有选择地除去行号信息、重定位信息、调试段、typchk 段、注释段、文件头以及所有或部分符号表。 一旦您使用该命令,则很难调试文件的符号;因此,通常应该只在已经调试和测试  过的生成模块上使用 strip 命令。使用 strip 命令减少对象文件所需的存储量开销。对于每个对象模块,strip 命令除去给出的选项所指定的信息。对于每个归档文件,strip 命令从归档中除去全局符号表。

    可以使用 ar -s 命令将除去的符号表恢复到归档文件或库文件中。

五,参考

5.1 gdbserver工具移植及使用简介

5.2 gdb和gdbserver的介绍与anzhuang

5.3 gdb和gdbserver的安装和调试

5.4 linux中的strip命令简介

5.5 交叉编译arm gdb

5.6 linux下gdb-8.2编译安装

5.7 Linux strip命令的用法

 

你可能感兴趣的:(makefile和gdb学习)