搜索

121

主题

128

帖子

665

积分

网站编辑

Rank: 8Rank: 8

积分
665
发表于 2021-6-7 11:15:14 5523 浏览 0 回复

i.MX6开发板QT系统移植Gdb+Gdbserver

本帖最后由 翠花儿 于 2021-6-7 11:28 编辑

因为有很多小伙伴是从单片机转过来的,用惯了单片机使用JLINk来调试程序,换到Linux非常不习惯。确实是如此,如果能在Linux上能设置断点,单步调试,查看变量,那就再好不过了。那么接下来将教大家怎么在arm板上调试应用代码的方法。相关的配套资料在网盘资料iTOP-i.MX6开发板资料汇总(不含光盘资料)\08_iTOP-i.MX6开发板Linux系统开发资料\23-QT系统移植Gdb+Gdbserver调试”目录。
*首先,了解下基本的思路:
采用这种方式进行远程调试,目标系统必须包括gdbserver程序,宿主机也必须安装gdb程序。一般Linux发行版中都有一个可以运行的gdb,但我们不能直接使用该发行版中的gdb来做远程调试,而要获取gdb的源代码包,针对arm平台做一个简单的配置,重新编译得到相应的gdb,如armv4.
*搭建环境
UBuntu版本:Ubuntu 14
交叉编译器:arm-2009q3.tar.bz2
gdb版本:gdb-7.8.1.tar.gz
开发板硬件:i.MX6Q开发板
开发板系统:支持ssh的Qt5.7系统,本文档附带的资料包里面有提供QT 5.7系统
注意事项:如果大家下载的gdb版本比较高,那么Ubuntu的GCC就必须用4.8以上的版本。交叉编译器要选择和自己编译的文件系统一致的编译器,因为busybox的根文件系统用的是arm-2009q3,所以这里编译gdb也使用这个编译
* 搭建步骤
(1) 第一步:下载gdb压缩包
下载地址:http://ftp.gnu.org/gnu/gdb/  这里我们下载的是gdb-7.8.1.tar.gz这个版本。
(2) 第二步:编译并安装gdb
把gdb压缩包放到ubuntu之后,我们进入到解压生成的文件,如下图所示:
输入以下命令:
./configure -target=arm-none-linux-gnueabi --prefix=/home/topeet/iMX6Q/gdb/arm-linux-gdb 生成Makefile。target为目标平台,prefix为安装路径,如下图所示
生成Makefile成功如下图所示:
输入make,编译gdb,编译成功如下图所示:
输入make install ,安装gdb,一会我们在ubuntu上启动的就是这个gdb,安装成功如下图所示:
进入gdb源码下的gdb/gdbserver目录,如下图所示:
输入以下命令:
./configure -target=arm-none-linux-gnueabi --prefix=/home/topeet/iMX6Q/gdb/arm-linux-gdb/arm-linux-gdbserver  
生成Makefile,target为目标平台,prefix为安装路径。
然后执行make CC=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc命令,注意,这里交叉编译器一定要写绝对路径。
编译过程中会出现下图所示错误:
我们打开gdb/gdbserver路径config.h文件,注释掉196行左右的HAVE_SYS_REG_H这个宏定义,然后保存退出。如图所示:
打开gdb/gdbserver路径linux-x86-low.cC文件注释掉116行#include<sys/reg.h>头文件,然后保存退出。如下图所示:
再次编译输入make CC=/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc,编译成功如下图所示:
编译完成后,使用make install 命令安装,安装完成后会在安装路径生成一个文件夹,如下图所示:
*第三步,在ARM板上搭建远程调试环境
(1) gdb/gdbserver/bin下的arm-none-linux-gnueabi-gdbserver 通过ssh拷贝到QT5.7文件系统的bin目录下
(2) 编写测试程序hello.c
编译测试程序,编译 的时候要加-g参数,编译如下图所示:
编译完成之后,我们把测试代码通过SSH放在开发板根目录下,如下图所示:
然后再赋予hello和arm-none-linux-gnueabi-gdbserver 文件777权限,然后在测试代码所在的路径下输入命令“/bin/arm-none-linux-gnueabi-gdbserver 192.168.1.9:8000 ./hello”在目标板启动服务器,其中192.168.1.9ubuntu的IP,8000为端口号。启动成功如下图所示:
测试程序所在目录启动ubuntu上的gdb,这里启动的gdb为我们刚刚安装的gdb,我们输入以下命令:
arm-linux-gdb/bin/arm-none-linux-gnueabi-gdb hello
启动成功后如下图所示:
连接开发板,输入以下命令,target remote 192.168.1.3:8000   192.168.1.3为开发板的IP,8000为端口号。
连接成功后开发板会打印以下信息,如下图所示:
接下来,我们就可以在ubuntu上使用命令来设置断点,单步调试开发板上的程序了,L 是显示程序,b 7 是在第七行设置断点,info b 是查看断点,c 是运行。
在串口控制台可以看到对应的打印信息
*打断点的方式主要有以下几种:
break 函数名:在某个函数的入口处添加断点
break 行号:在指定行添加断点
break文件名:行号:在指定文件的指定行添加断点
break行号 if 条件当条件为真时,指定行号的断点生效。
查看我们打的断点,使用命令info breakpoints,可以看见我刚才打的断点
删除断点,使用命令delete断点编号来完成
运行程序,输入命令run
输入命令:print i命令格式:print 变量名称。查看指定变量数值。
我们也可以对变量i进行监控,可以输入命令 watch i,命令格式:watch 变量名称。对指定变量进行监控。.
next:单步运行程序,不进入子函数。
step:单步运行程序,进去子函数。
如果我们想继续调试呢,可以输入命令continue
退出调试。可以使用命令quit
总结:
上面的命令也可以使用简写,如break可以简写成b,简写表如下:
说明:
目标机上的被调试程序hello,与主机上的程序hello,是相同的程序,但位置不一样,并非是用网络共享的同一个位置的同一个文件,一个在目标机上,一个在主机上,没有关系。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

返回列表
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

登录或注册

官方客服

QQ:2551456065

官方QQ群

195631883

扫一扫关注迅为公众号

群号652692981

 
快速回复 返回顶部 返回列表