嵌入式gdb+gdbserver调试环境搭建与使用

目录

一、原理

二、环境搭建

三、调试过程

四、gdb常用命令

1、l(list)命令

2、b(break)命令

3、c命令

4、s命令

5、n命令

6、 p命令

7、 q命令


一、原理

嵌入式系统中一般在 PC端运行 gdb工具,源码也是在 PC端,源码对应的可执行文件放到开发板中运行。为此我们需要在开发板中运行 gdbserver,通过网络与 PC端的 gdb进行通信。因此要想在 PC上通过 gdb调试嵌入式程序,那么需要两个东西:gdb和gdbserver,其中 gdb是运行在 PC上的, gdbserver需要我们移植到开发板上。

二、环境搭建

一般交叉编译已经自带了 gdb和 gdbserver,可以不用移植,直接使用交叉编译器自带的即可,直接将gdbserver拷贝到根文件系统的 /usr/bin 目录下,开发板启动以后通过nfs服务使用ubuntu下的跟文件系统;如果交叉编译器没有自带则需要下载源码进行安装

1、交叉编译器自带

安装目录:

将gdbserver拷贝到rootfs根文件系统 /usr/bin 中:

sudo cp /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/gdbserver /home/denghengli/linux/nfs/rootfs/usr/bin/

2、源码下载安装步骤

略。。。

三、调试过程

1、将源码编译成带调试信息的可执行文件,然后拷贝到开发板上。比如在ubuntu下编写了一个gdbtest.c文件,编译完成以后将得到的gdbtest可执行文件发送到开发板中

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

int main(int argc, char *argv[])
{
	unsigned int times = 0;

	while (1)
	{
		printf("runging times: %d \r\n", times);
		times++;
		sleep(1);
	}
}

编译:

arm-linux-gnueabihf-gcc gdbtest.c -o gdbtest -g //编译测试程序,注意 -g选项

拷贝至rootfs根文件系统下(开发板启动以后通过nfs服务使用ubuntu下的跟文件系统):

sudo cp gdbtest /home/denghengli/linux/nfs/rootfs/lib/modules/4.1.15/

2、在开发板中,启动gdbserver并执行要调试的执行文件

gdbserver 192.168.0.107:2000 gdbtest //启动开发板上的 gdbserver

192.168.0.107为指定的ubuntu主机ip

2000为要开启调试的端口,可以随意指定

gdbtest为调试的可执行文件,一定要带上gdbtest的路径!!

3、在ubuntu中开启gdb并连接到开发板上的gdbserver

arm-linux-gnueabihf-gdb gdbtest //启动gdb调试
target remote 192.168.0.20:2000 //连接到开发板,192.168.0.20为开发板ip

连接成功后,会提示 Remote debugging using 192.168.0.20:2000

4、通过调试命令进行调试

将断点设置在12行处,输入c运行至断点,此时程序就会在开发板中运行,并在控制台输出打印信息

输入p打印times信息,最后输入q退出调试,开发板上的 gdbserver也会停止。

四、gdb常用命令

1、l(list)命令

列出所有程序源码;命令以后就打印出了调试程序的所有源码,如果源码没有打印完的话就重复按下“l”命令,或者按下回车键 gdb调试工具中回车键表示重复上一个命令!

2、b(break)命令

用于设置断点,后面可以跟具体的函数或者行号

3、c命令

用于运行到断点处

4、s命令

s命令 (step)是单步运行执行,此函数会进入到函数里面。

5、n命令

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

6、 p命令

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

7、 q命令

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

猜你喜欢

转载自blog.csdn.net/m0_37845735/article/details/107031218
今日推荐