前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手教你 gdb 调试

手把手教你 gdb 调试

作者头像
Jasonangel
发布2022-04-08 16:35:13
5.5K0
发布2022-04-08 16:35:13
举报

在学习单片机的时候我们可以通过集成式 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:%d\r\n", 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 ··················

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 嵌入式Linux系统开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • GDB 简介
  • 1、在 ubuntu 中调试
  • 2、在板子中调试
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档