嵌入式GDB调试环境搭建与使用

注:本文参考了正点原子的《I.MX6U 嵌入式Linux驱动开发指南》,只用于学习记录。

1. GDB 简介

    gdb 工具是 GNU 项目调试器,基于命令行。和其他的调试器一样,我们可以使用 gdb 来一行行的运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等,它是 UNIX/LINUX 操作系统下强大的程序调试工具。对于一般的Linux桌面系统(例如,ubuntu、centos等),我们可以直接运行gdb来调试程序。但嵌入式系统中的芯片性能较弱,无法直接运行gdb调试程序。所以,嵌入式系统一般在PC端运行gdb工具,源码也放在PC端,源码对应的可执行程序放在开发板运行。那么在调试程序时,开发板如何与PC段通信呢?这需要在开发板运行gdbserver,通过网络与PC端进行通信。因此,在搭建GDB调试环境,需要我们在PC端安装gdb用具、移植gdbserver到开发板。

2. 本实验使用的平台环境

  • PC端:Ubuntu-16.04
  • 开发板: JZ2440开发板
  • kernel:Linux-4.15
  • 交叉编译器:arm-linux-gcc 4.4.3
  • gdb:gdb7.10 (最初使用的是最新的gdb9.20,由于arm-linux-gcc 4.4.3不支持C++11,最后改用低版本的gdb7.10)

3. gdb移植

    由于系统安装的arm-linux-gcc 4.4.3交叉编译器没有自带gdb和gdbserver,所以需要另外安装、移植gdb和gdbserver工具。

3.1 获取gdb和gdbsevver源码

我们可以在gdb的官网上获取源码,地址为http://www.gnu.org/software/gdb/download/,下载源码gdb-7.10.tar.xz,下载完成后,上存到Ubuntu进行解压:解压命令如下:

tar vxf gdb-7.10.tar.xz

解压完成后就会得到一个名为gdb-7.10的文件夹,该文件夹就包含了gdb和gdbserver的源码,其中gdb-7.10/gdb/gdbserver目录就是gdbserver的源码。

3.2 编译gdb

首先编译 gdb, gdb 是运行在 PC 端的程序, gdb 编译的时候需要进行配置,配置项如下:

  • --target: 目标机交叉编译器前缀,也就是你所使用的交叉编译器前缀,本文设置为 arm-linux
    
  • --host: 指定编译后的程序在哪里运行,编译 gdb 的时候就需用设置,因为我们是需要在 PC上运行的,编译 gdbserver 的时候就要设置为 arm-linux
    
  • --prefix: 指定安装目录。
    

编译gdb的命令如下:

cd gdb-7.10/       //进入gdb源码目录
mkdir build       //在 gdb 源码下新建 build 目录, gdb 编译比较奇葩!不能直接在 gdb 源码目录下进行配置和编译,
                  //必须新建一个文件夹,然后在此文件夹下配置和编译,切记!
cd build/         //进入到刚刚创建的 build 目录下
../configure --target=arm-linux --prefix=/work/tools/gdb  //配置gdb,配置完成后,会在build目录下生成Makefile文件。
make             //编译
make install     //安装

编译、安装完成后,gdb工具会被安装到gdb/bin目录下,名字为arm-linux-gdb,如下图所示:
在这里插入图片描述
在上述的目录下运行arm-linux-gdb,命令如下:

./arm-linux-gdb

运行结果如下:
在这里插入图片描述
从上图可看出,arm-linux-gdb的版本为7.10,说明安装成功,输入q可以退出gdb工具。

3.3 修改环境变量

    前面我们只能在gdb/bin目录下运行arm-linux-gdb工具,为了能够在任意命令行中都可以运行arm-linux-gdb工具,需要修改系统PATH环境变量的值,把arm-linux-gdb工具所在的目录路径添加到PATH环境变量。

(1) 打开/etc/profile文件:

vim /etc/profile     //打开

(2) 添加/etc/profile最后添加:

export PATH=$PATH:/work/tools/gdb/bin

(3) 生效修改过的/etc/profile文件:

source /etc/profile

此时我们就可以使用arm-linux-gdb命令工具了。

4. gdbserver移植

    接下来移植 gdbserver, gdbserver 是在开发板上运行的,因此要交叉编译。gdbserver的源码保存在gdb-7.10/gdb/gdbserver目录下,进入此目录,然后输入如下命令配置并编译:

cd gdb-7.10/gdb/gdbserver       //进入gdbserver源码目录
./configure --target=arm-linux --host=arm-linux //配置
make CC=arm-linux-gcc          //交叉编译 gdbserver

交叉彼岸完成后,会在该目录下生成一个名为gdbserver的文件,这个文件就是我们需要放到开发板上去的gdbserver,如下图所示:
在这里插入图片描述
把上图交叉编译出来的 gdbserver 软件发送到开发板中的/usr/bin 目录下,完成以后在开发板中输入如下命令查看 gdbserver 版本号:

gdbserver --version

如果 gdbserver 移植成功的话就会打印出其版本号,如下图所示:
在这里插入图片描述

5. 使用 GDB 进行嵌入式程序调试

5.1 编写一个测试应用程序

(1) 编写一个简单的测试软件,命名为test.c,然后使用gdb工具来调试这个程序。test.c的内容如下:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv)
{
	unsigned int times = 0;
	while(1)
	{
		printf("running times:%d\n", times);
		times++;
		sleep(1);
	}
}

(2) 使用arm-linux-gcc 编译test.c程序,需要调试程序,在编译时必须加上“-g” 选项,这样编译出来的可执行文件才带有调试信息。编译命令如下:

arm-linux-gcc -o test test.c -g

编译完成后,把编译出来的test可执行问发送到开发板中。

5. 2 使用GDB调试程序

(1) 在开发板启动gdbsever,连接PC端(这里的PC端是指ubuntu),命令如下:

gdbsever 192.168.0.107:2001 test     

在上面的名字中,

  • 192.168.0.107为调试及的IP地址,即PC端Ubuntu的IP地址;
  • 2001是端口号,这里可以任意给一个端口号;
  • test是需要调试的可执行文件。

输入上面的命令后,会打印如下信息,如下图所示:
在这里插入图片描述
(2) 在PC端启动arm-linux-gdb,并连接开发板,命令如下:

arm-linux-gdb test

打印信息如下:
在这里插入图片描述
上图最下面的(gdb)行用于输入命令,输入如下命令,连接上开发板:

target remote 192.168.0.200:2001

在上面的命令中:

  • 192.168.0.200是开发板的IP地址;
  • 2001是开发板gdbserver设置的端口。

连接成功后,开发板会打印多Remote debugging from host 192.168.0.107信息,如下图所示:
在这里插入图片描述

5.3 gdb 调试命令

(1) l 命令
l 命令(list)用于列出所有程序源码,输入“l”,结果如下图所示:
在这里插入图片描述
注:如果源码没有打印完,重复输入“l”命令,可以继续接着打印源码;按下回车(enter)键,可重复上一命令。
(2) b 命令
b 命令(break)用于设置断点,也可以用缩写“b”,后面可以跟具体的函数或者行号。例如:“break main”表示在 main 函数处设置断点,“break 11”在第 11 行设置断点。在main函数设置断点:

 b main

设置完成后,提示如下图所示:
在这里插入图片描述
(3) c 命令
c 命令用于运行到断点出,输入 c 命令程序就会运行,直到下一个断点处,如下图所示:
在这里插入图片描述
继续输入“c”命令,程序就好持续不断的运行,如下图所示,当然,这是因为后面没有设置断点。
在这里插入图片描述
(4) s 命令
s 命令(step)是单步运行执行,此命令会进入到函数里面。

(5) n 命令
n 命令(next)也是单步运行,但是 n 命令不会进入到函数里面。

(6) p 命令
p 命令(print)用于打印某个变量值。

(7) q 命令
q 命令(quit)用于退出调试,开发板上的 gdbserver 也会停止。

最后,更多的gdb命令,可查看GDB常用命令大全 GDB 命令详细解释

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Louis@L.M.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值