在单片机开发中,都可以利用iar或keil等ide,用仿真器对单片机进行调试。而在linux-arm开发中,应用程序运行在目标板的linux系统下, 高效的调试能大大提高开发效率。
这个过程自然少不了linux下的调试神器gdb。但问题在于,我现在要调试的是目标板的程序——交叉编译后运行在目标板的程序,而且还要进行远程调试。这里就带来了两个问题: 1.如何远程连接目标板,并使程序进入调试状态;2.调试交叉编译后的程序应该用什么样的gdb。
答案就是——gdbserver + arm-linux-gdb
一、TCP连接主机和目标机
主机即为开发机,通常是在windows下运行了Linux虚拟机。我用的是VBox+Ubuntu16.04;目标机即为产品,或开发板,我这里使用的是海思的开发板。
连接主机和目标机的标志就是互相能ping通。在VBox中将虚拟机的网络设置为桥接模式。进入虚拟机后,将虚拟机IP由DHCP自动获取改为手动,并设置IP与windows在同一网段,设置好后断开连接再重连,终端输入ifconfig,看是否设置成功;同时在目标机设置IP与主机同一网段,设置完后重启网络,或重启设备。
这样一来,Ubuntu-Windows-开发板间就可以相互ping通了。
二、获得gdbserver及arm-linux-gdb
我使用的是gdb7.9.1,因为海思官方SDK中提供的gdb就是gdb7.9.1,且SDK中已经提供了交叉编译好的gdbserver。只需要交叉编译获得交叉编译的gdb就好了。具体步骤参考实现交叉编译gdb和gdbserver(gdb-7.6),按步骤来就可以获得对应的gdbserver及arm-linux-gdb了。
获得gdbserver后,将其放入开发板的/bin中,并更改权限
chmod 777 gdbserver
三、eclipse建立工程
Linux下的eclipse如何安装百度一大把,我这里使用的是eclipse-cpp-2020-03-R-incubation-linux-gtk-x86_64.tar.gz,下载地址
新建一个简单的c project,就叫gdbtest吧,用于调试验证。注意选择工具链为交叉编译gcc
之后选择交叉编译链,我这里是arm-himix200-linux- ,根据你的交叉编译链填写。
然后写一个最简单的程序用于调试
#include "stdio.h"
int main()
{
int i ;
for(i=0;i<10;i++)
{
printf("%d\n",i);
}
return 0;
}
编译通过后,会在工程目录的Debug目录下生成项目同名的可执行文件,将执行文件扔到开发板,运行没问题后再进行调试配置。
四、eclipse调试配置
点击Debug Configurations,双击C/C++ Remote Application。新建一个远程调试项,分别按以下步骤进行配置。
点击Selected other,做如下配置
之后选择Debugger标签页,GDB debugger选择之前编译好的交叉gdb,我这里是arm-himix200-linux-gdb。
之后点击Connection选项卡,做如下配置。其中IP地址为开发板的地址,端口随意设置。这个IP和端口就是在开发板开启gdbserver的连接凭证。
配置好后点击Apply使其生效。这样eclipse的调试环境就搭建好了,gdbserver也放到开发板了,接下来就是远程调试实验了。
五、远程调试
在开发板中进入执行文件的目录,即之前用eclipse编译好的gdbtest文件,用gdbserver运行之,这里的IP和端口必须和Eclipse中配置的相符。之后gdbserver开始监听远程调试。
gdbserver 172.21.25.220:1111 gdbtest
这时在eclipse中的Debug Configurations双击刚刚建立的C/C++ Remote Application进入远程调试,在开发板中随即看到如下信息,说有172.21.25.219连进来了,这个就是我的虚拟机的IP。
如此一来便打通了eclipse+gdbserver远程调试的通道。在eclipse中可以直观的对程序进行调试,打断点、看变量,一切都很直观,就像单片机开发时的仿真一模一样。