基于Ubuntu的嵌入式开发练习(四)学习如何使用GDB来调试程序

it2025-04-25  11

如有错误,欢迎指正,谢谢!

目录

一、GDB简介1、什么是GDB2、我们能用GDB做什么 二、GDB的使用1、与GCC配合使用,输出调试信息2、GDB启动方式3、GDB参数 三、实例练习(一)四、实例练习(二)段错误调试四、实例练习(三)借助core调试

一、GDB简介

1、什么是GDB

GDB : GNU Debugger,是GNU工程为GNU操作系统开发的 调试器,但它的使用不局限于GNU操作系统, GDB可以运行 在UNIX、Linux甚至Microsoft Windows。

2、我们能用GDB做什么

能设置断点使程序停住,从而观察变量的变化以及函数的执行情况,还可以跳过某些函数来查错

二、GDB的使用

1、与GCC配合使用,输出调试信息

gcc –g –o main main.c 用gdb调试时,必须要有调试信息,通过上述命令就可以给该程序添加调试信息

2、GDB启动方式

gdb 程序名 注意此处的程序必须是

3、GDB参数

参数作用file装入想要调试的可执行文件kill终止正在调试的程序list列出产生执行文件的源代码的一部分next执行一行源代码但不进入函数内部step执行一行源代码而且进入函数内部run执行当前被调试的程序c继续运行程序quit终止gdbwatch使你能监视一个变量的值而不管它何时被改变backtrace栈跟踪,查出代码被谁调用print查看变量的值make使你能不退出gdb就可以重新产生可执行文件shell使你能不离开gdb就执行UNIX shell命令whatis显示变量或函数类型break在代码里设断点,这将使程序执行到这里时被挂起info break显示当前断点清单,包括到达断点处的次数等info files显示被调试文件的详细信息info func显示所有的函数名称info local显示当函数中的局部变量信息info prog显示被调试程序的执行状态delete [n]删除第n个断点disable[n]关闭第n个断点enable[n]开启第n个断点ptype显示结构定义set variable设置变量的值call name(args)调用并执行名为name,参数为args的函数Finish终止当前函数并输出返回值return value停止当前函数并返回value给调用者

三、实例练习(一)

我们先使用该程序作为例子

#include <stdio.h> void ShowRevertNum(int iNum) { while (iNum > 10) { printf("%d", iNum % 10); iNum = iNum / 10; } printf("%d\n", iNum); } int main(void) { int iNum; printf("Please input a number :"); scanf("%d", &iNum); printf("After revert : "); ShowRevertNum(iNum); }

代码功能说明:该代码的作用是将一个数倒过来,如:431经过该系统后就变为134。 但程序在输入100时会出错,让我们来寻找错误吧。

首先我们先用gcc生成带调试信息的程序,再启用gdb 通过gdb l列出源代码(此处的l等效为list) 此处的作用是方便我们再之后的过程中通过行号下断点 下断点 下断点有多种方式,可以通过行号下断点(个人感觉该方式比较方便),还可以通过函数名下断点 当我们下好断点后就可以让程序开始运行了 当我们输入数据后,程序继续运行并在第一个断点处停下来了此时我们通过whatis和print来查询iNum的类型、打印其值

让程序继续运行,到达第二个断点,再通过next逐步调试,找出错误

调试完后,通过quit退出

四、实例练习(二)段错误调试

同样的我们从一个例子入手

#include <stdio.h> #include <string.h> #define BUFSIZE 256 static char acBuf [BUFSIZE] ; static char *pStr; int main(void) { printf("Please input a string:"); gets(pStr); printf("\nYour string is:%s\n", pStr); }

我们先正常的用gcc编译,再执行试试 这时我们就发现出现了段错误(Segmentation fault) 那么,我们就要用GDB设断点来调试了

还是想用gcc生成带调试信息的可执行文件,再进入gdb

我们先看看pStr的值 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023210000373.png#pic_center

查看代码并下断点

继续运行该程序,并重新设置pStr的值set variable pStr=&acBuf

单步执行,就可以输出了

四、实例练习(三)借助core调试

让系统产生core文件 ulimit -c num num设定core文件容量(num为数字,为0时是不产生core文件运行程序,让程序崩溃,从而生成core文件gdb配合core文件,定位问题 gdb 程序名 core文件名 例:gdb main cores 由于不知名的原因,没有信息,我裂开了,等我后续去查一下资料吧 额,我先前在共享文件夹下做的,现在换到一般文件夹下就没问题了
最新回复(0)