gdbserver+gdb实现远程调试

此文档主要介绍ubuntu与vs code两种环境下,通过gdbserver + gdb对目标板中程序实现远程调试。

一、ubuntu环境调式

首先介绍在ubuntu下如何编译、调试gdb和gdbserver。(如果SDK包中有gdb及gdbserve可忽略编译,否则需要到官网下载gdb源码)。

gdb-8.2的源码包下载地址为:http://ftp.gnu.org/gnu/gdb/

在创建之前需要输入gcc -v命令,查看gcc版本是否支持c++11,否则需要进行升级(GCC 4.8版本及以上支持):

 

 

gdbserver在目标系统中运行,gdb则在宿主机上运行,双方都要统一编译工具链,版本最好保持一致。

--target 指定了目标机交叉编译器前缀,比如--target=arm-linux

--host 指定了编译后的程序需要在哪里运行

--prefix  指定了要安装的目录。

因此,在编译arm-linux-gdb的时候,不需要指定host,因为它是在本地PC上跑的,在编译gdbserver时,需要指定host为arm-linux,因为gdbserver是在arm平台上跑的。两者都需要指定相同的target。

1、编译arm-linux-gdb

解压gdb-8.2压缩包,在根目录新建 arm-gdb文件夹,用于存放编译生成文件,进入gdb-8.2文件夹,执行:

./configure --target=arm-linux --prefix=/arm-gdb/

 

 

然后sudo make && make install ,就可以在arm-gdb/bin/目录下面找到arm-linux-gdb。

--target=arm-linux意思是你的交叉编译器的前缀是arm-linux,如果你的交叉编译器叫arm-linux-gnueabi-gcc,那么这里应该填--target=arm-linux-gnueabi。如果有需要,可以将此执行路径加入到系统环境变量中去。

2、编译gdbserver

在gdb-8.2目录中,切换到gdb/gdbserver目录中,执行:

./configure  --target=arm-linux  --host=arm-linux

make CC=/xxx/xxx/bin/arm-linux-gcc CFLAGS=-static(交叉编译工具链路径),就可以将当前目录下生成gdbserver拷贝进目标板。这里需要注意的是运行gdbserver还需要libthread_db库,若你自己做的文件系统内没有这个库的话需要将本地交叉编译工具中的libthread_db*拷贝到目标板中去。最后是做一下权限的修改和去掉无关的调试信息,这些东西用不到,去掉后还能减少文件大小:

chmod 777 gdbserver

arm-linux-strip gdbserver

  1. gdbserver+gdb调试流程

将ubuntu的网络适配器设置为桥接模式,并把电脑主机、虚拟机和目标板IP地址设置在同一个网络段。

 

 

主机:打开网络和共享中心设置固定IP:192.168.0.188;

虚拟机:1)在终端输入sudo vi /etc/network/interfaces更改IP为:192.168.0.100(Ubuntu系统的网卡为ens33或eth0):

 

 

2)输入sudo vi /etc/resolv.conf设置DNS文件,nameserver与网关一致:

 

 

  1. 输入s1udo vi /etc/rc.local修改启动脚本为:

 

 

  1. 重启配置文件:/etc/init.d/networking restart。

目标板:在终端输入vi /etc/profile命令,配置目标板IP为192.168.0.200:

 

 

在目标板、虚拟机和主机命令窗口上使用ping命令,看相互之间是否能ping通。如果ping不通,检查电脑防火墙是否已经关闭,网线是否连接好,直至ping通为止。

接下来在本地机器上面,用arm-linux-gcc –g 编译一个应用程序,在开发板上,执行:./gdbserver 192.168.0.100:6666 ./main(端口号随意输入,与目标板与主机或虚拟机输入时一致即可)。

 

 

然后在ubuntu上面,输入arm-linux-gdb  ./main,然后输入target remote 192.168.0.200:6666,按回车键就会连接成功,开发板上会显示:1remote debugging from host 192.168.0.100。

 

 

然后就可以在ubuntu上面执行gdb命令,需要注意执行target remote 后,开发板上面的程序已经在运行,本地不能使用run命令,而能用continue命令。调试命令在本地输入,调试输出结果会在目标板上面输出。

 

  • Windows vs code工具调式

 根据板子下载对应的交叉编译工具链Windows版,下载链接:

https://www.veryarm.com/5501.html。再将交叉编译器gcc路径添加到path环境变量。

 

 

在安装包中可以找到已经做好的gdbserver,拷贝进目标板中。同样目标板与主机命令窗口上使用ping命令,看相互之间是否能ping通。

接下来在vs code终端上面,用arm-linux-gnueabihf-gcc(交叉编译器) –g 编译一个应用程序。               

 

 

在开发板上,执行:./gdbserver 192.168.0.188:6666 ./main

 

 

添加断点,点击调式->启动调试,目标板链接成功,显示:Remote debugging from host 192.168.0.188。Vs code成功进入调试界面:

 

  • 安装调式时出现的问题

3.1 ping不通问题

问题描述: 

在检查网络时,发现主机可以ping通开发板,开发板却ping不通主机。

解决方式:

  1. 查看IP地址示是否设置在同一网段;2、查看并关闭电脑自带防火墙。开始菜单→控制面板→系统和安全→windows防火墙→打开或关闭windows防火墙(全部选择关闭)。

3.2 gdbserver与arm-linux-gdb版本不一致

问题描述:

在调试过程中,提示为:the program is not being run或设置断点后,继续运行会直接退出程序。

解决方式:

找到自己制作的arm-linux-gdb和gdbserver进行匹配调试

参考:https://blog.csdn.net/zhaoxd200808501/article/details/77838933

          https://blog.csdn.net/tiramisu_L/article/details/80557772

 

发布了9 篇原创文章 · 获赞 5 · 访问量 2206

猜你喜欢

转载自blog.csdn.net/CSDN_liu_sir/article/details/101015323
今日推荐