开发环境
- PC系统:VMware虚拟机 Ubuntu16.04
- arm板:海思HI3536开发板
- 交叉编译器:
arm-hisiv400-linux-gcc
目标
把本地调试版的gdb移植到arm板上增加板子的调试功能
gdb的移植分为两种:
1. 远程调试
这一种模式是需要交叉编译gdb和gdbserver,将交叉编译好的gdbserver移植到arm板上,再通过串口或者网线将PC与arm板连接起来,实现远程调试。
2. 本地调试
这种模式把整个gdb移植成一个arm的本地版,直接在开发板上用gdb来调试。本博客介绍的是这种本地调试模式。
参考链接
http://blog.chinaunix.net/uid-23381466-id-309369.html
https://blog.csdn.net/ZefinNg/article/details/96479993
1.安装交叉编译器
这里不同环境交叉编译器也不相同,不做详细介绍,可参考其他博客。
但是一定要注意,安装好交叉编译器是后续步骤的基础。移植的思路是:下载gdb源码——使用交叉编译器编译gdb生成可执行程序——将可执行程序移植到arm板上。因此,如果交叉编译器没有安装成功,是无法生成可以在arm板上可运行的可执行程序的。
本贴中使用的是海思交叉编译器
1 | arm-hisiv400-linux-gcc -v |
若正常显示交叉编译器的版本,说明已安装成功,如下图所示:
另外,还要检查交叉编译器是否已经添加至环境变量
1 | vi /etc/profile |
如下图所示。
总而言之,第一步的主要任务是确保交叉编译器已安装成功,详细信息请参阅对应交叉编译器的其他博客。海思交叉编译器的安装可以参考下面这篇博客:
https://blog.csdn.net/qq_29350001/article/details/52440188
2.移植ncurses库
本地gdb运行需要ncurses库的支持,因此先做ncurses库的移植。
下载地址:http://ftp.gnu.org/gnu/ncurses/
本贴下载的是
进入下载目录,输入命令进行解压
1 | tar -zxvf ncurses-5.9.tar.gz |
进入解压后的目录
1 | cd ./ncurses-5.9 |
配置Makfile
1 | ./configure --host=arm-hisiv400-linux --prefix=$PWD/output/arm --enable-termcap --with-shared |
其中,
make,仍然是在解压的目录里
1 | make |
make install
1 | make install |
这两步有时会出错,请注意观察命令行反馈的错误信息,善用搜索。博主本人在这一步遇到的主要问题是明明交叉编译器已经安装好了,make也成功了,但make install一直出错,最终的解决方案是换了一个版本的ncurses库,也就是换到5.9版本后编译成功了。
以上操作成功后,会在
3.移植gdb
下载gdb源代码:http://ftp.gnu.org/gnu/gdb/
本贴下载版本的是
请注意,博主之前下载过6.8a和7.0a的版本,但编译时都会出错,查询很多博客说是gdb源码的问题,所以建议大家直接选择7.6.1版本的。
进入下载目录解压
1 | tar -xvf gdb-7.6.1.tar.gz |
进入解压目录
1 | cd gdb-7.6.1 |
配置Makefile文件
1 | ./configure --host=arm-hisiv400-linux CC=/opt/hisi-linux/x86-arm/arm-hisiv400-linux/target/bin/arm-hisiv400-linux-gcc --enable-shared --prefix=$PWD/output/arm --disable-werror --without-x --disable-gdbtk --disable-tui --without-included-regex --without-included-gettext LDFLAGS="-L/home/xin/Downloads/ncurses-5.9/output/arm/lib" CPPFLASS="-I/home/xin/Downloads/ncurses-5.9/output/arm/include" |
这里解释下部分参数
``CPPFLASS 是是第2步中的ncurses库编译后生成的include文件夹的绝对路径
其余参数也请不要忘记
make
1 | make |
make install
1 | make install |
与安装ncurses库类似,这两部编译也经常容易出错,请详细检查之前的操作是否正确,观察命令行的错误信息,善用搜索引擎,多次尝试。
以上步骤成功后会在
1 | arm-hisiv400-linux-strip gdb |
其中前面的命令是对应的交叉编译器,执行该命令后,
4.移植到arm板
将第2步、第3步中生成的可执行文件
1 | chmod +x libncurses.so.5 gdb |
并将
1 | cp libncurses.so.5 /usr/lib |
并将
1 | cp gdb /bin |
5.调试测试
在Ubuntu环境下编写一个简单的C程序,命名为
1 | arm-hisiv400-linux-gcc -g gdb_test.c -o gdb_test |
其中
将生成的可执行文件
1 | chmod +x gdb_test |
进行gdb调试
1 | gdb gdb_test |
即可进入gdb调试环境,进行调试了。
成功图如下所示:
总结
最关键的步骤就是利用交叉编译器编译ncurses库和gdb源码生成可执行文件,后续将可执行文件拷贝到arm板上即可。其中交叉编译最容易出问题,博主在尝试的时候绝大部分时间也是花在交叉编译ncurses库和gdb源代码上面了。如果交叉编译出从,我的建议是
- 观察命令行返回的错误,利用搜索引擎搜索该错误,查找经验贴
- 检查之前步骤是否有错误,如交叉编译器是否安装成功、Makefile是否配置正确
- 换一个版本的ncurses库和gdb源代码
- 多次尝试,不要怕出错,太乱了就删除掉安装目录重新再来。
第一次写博客,以上也是我参考了许多博客、自己不断尝试才取得的成功,想把自己的经验记录下来以便日后查看,也希望对相关人员有所帮助。如有错误,欢迎指正,如有问题,欢迎交流~