手把手教你 gdb 调试

2022-04-08 16:35:13 浏览数 (1)

在学习单片机的时候我们可以通过集成式 IDE 来进行调试,比如 MDK、IAR 等。在嵌入式 linux 领域是否也可以进行调试呢?答案肯定是可以的,在嵌入式 linux 领域我们最常用的就是 GDB 调试工具,通过 GDB 来调试嵌入式 C 程序。

GDB 简介

gdb 工具是 GNU 项目调试器,基于命令行。和其他的调试器一样,我们可以使用 gdb 来一行行的运行程序、单步执行、跳入/跳出函数、设置断点、查看变量等等,它是 UNIX/LINUX 操作系统下强大的程序调试工具。

gdb 支持多种语言,包括 Ada、汇编、C/C 、D、Fortran、GO、Objective-C、OpenCL、Modula-2、Pascal 和 Rust。gdb 官网地址为:www.gnu.org。

博主用的是 ubuntu16.04,自带 gdb ,版本如下:

1、在 ubuntu 中调试

gdbtest.c

代码语言:javascript复制
#include <stdio.h>
#include <unistd.h>

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

 while(1) {
  printf("runing times:%drn", times);
  times  ;
  sleep(1);
 }
}

编译命令

这里自己选一个已经安装的 gcc 编译器即可,注意需要加 -g 选项,才能使用 gdb 调试

代码语言:javascript复制
arm-linux-gnueabihf-gcc gdbtest.c -o gdbtest -g //编译测试程序,注意-g 选项

编译后会产生 gdbtest 文件

调试命令:

代码语言:javascript复制
gdb xxx

会出现一个 (gdb)的指示符,等待你输入命令,可用的命令如下:

当然不止这些,还有很多,常用的就这几个。

举例:输入 l

回车代表执行上一个命令。

b 命令(break)用于设置断点,也可以用缩写“b”,后面可以跟具体的函数或者行号,比如“break main”表示在 main 函数处设置断点,“break 11”在第 11 行设置断点。

c 命令用于运行到断点出,输入 c 命令程序就会运行,直到下一个断点处。

2、在板子中调试

上面的方法是直接在 ubuntu 调试源代码,只能查看源代码的错误,如果你想要你的应用程序在板子中运行,想打出它在板子上运行的 bug,就要采用下面的方法。

一般的桌面 Linux 系统,比如 ubuntu、centos 等,我们可以直接运行 gdb 来调试程序。但是嵌入式中芯片性能一般比较弱,所以直接在嵌入式系统中运行 gdb 不太现实(性能强大的嵌入式芯片可以这么做)。嵌入式系统中一般在 PC 端运行 gdb 工具,源码也是在 PC 端,源码对应的可执行文件放到开发板中运行。为此我们需要在开发板中运行 gdbserver,通过网络与 PC 端的 gdb 进行通信。因此要想在 PC 上通过 gdb 调试嵌入式程序,那么需要两个东西:gdb 和 gdbserver,其中 gdb 是运行在 PC 上的,gdbserver 需要我们移植到开发板上。

实操如下:

博主在 ubuntu 中为 imx6ull 开发板安装过交叉编译工具链,该工具链自带了 gdb 调试工具。包含了 arm-linux-gnueabihf-gdb 和 gdbserver。

将 gdbserver 拷贝到开发板 /bin 目录下。将上文编译出来的 gdbtest 文件拷贝到板子中。

确保 ubuntu和开发板可以进行网络通信。在开发板中输入如下命令:

代码语言:javascript复制
gdbserver 192.168.31.121:2001 gdbtest //启动开发板上的 gdbserver

192.168.31.121 为 ubuntu 的 IP 地址,2001 是端口号, 可以任意给一个端口号,gdbtest 是要调试的可执行文件。输入以后开发板输出信息如图所示:

接着在 ubuntu 中输入如下命令启动 gdb 调试工具:

代码语言:javascript复制
arm-linux-gnueabihf-gdb gdbtest

如果该命令不能运行,请将你交叉编译工具链的目录配置到 /etc/profile 文件最后,并且在命令行输入 source /etc/profile,其实就是让你的环境变量生效。

结果如图所示:

图中最下面的(gdb)行用于输入命令,输入如下命令连接到开发板上:

代码语言:javascript复制
target remote 192.168.31.207:2001   //连接到开发板上

上述命令表示连接到开发板上,其中 192.168.31.207 就是开发板 IP 地址,2001 就是开发板 gdbserver 设置的端口号。连接成功以后开发板中的 gdbserver 就会提示连接信息,

连接成功以后就可以在 ubuntu 上进行代码调试了,调试的文件是在板子上运行的,可以复现你想要的信息,比如可以打出你的应用程序在板子上的 bug。

·················· END ··················

0 人点赞