嵌入式系统--GDB调试

GDB简介

• GDB : GNU Debugger,是GNU工程为GNU操作系统开发的调试器,但它的使用不局限于GNU操作系统, GDB可以运行在UNIX、Linux甚至Microsoft Windows。
• GDB可以调试C、C++、Objective-C、Pascal、Ada等语言编写的程序;被调试的程序可以跟GDB运行于同一台电脑,也可运行于不同电脑。
• 使用GDB我们可以:
– 设置断点使程序停住
– 监视或修改程序中变量的值
– 跟踪代码执行过程

GDB命令

• file 装入想要调试的可执行文件。
• kill 终止正在调试的程序。
• list 列出产生执行文件的源代码的一部分。
• next 执行一行源代码但不进入函数内部。
• step 执行一行源代码而且进入函数内部。
• run 执行当前被调试的程序。
• c 继续运行程序。
• quit 终止gdb。 • watch 使你能监视一个变量的值而不管它何时被改变。
• 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给调用者。
• break命令的使用
– 根据行号设置断点:
• (gdb) break linenum
– 根据函数名设置断点: • (gdb) break funcname
– 执行非当前源文件的某行或某函数时停止执行: • (gdb) break filename:linenum
• (gdb) break filename:funcname
– 根据条件停止程序执行: • (gdb) break linenum if expr
• (gdb) break funcname if expr

GDB调试举例

gdb的使用

• 程序要能被调试,必须包含调试信息
• 编译程序时,通过gcc的-g选项为程序添加调试信息,例如:
gcc –g –o helloworld helloworld.c

启动gdb

• gdb [程序名]

实例

1.首先我们用vim或者gedit编辑器编写名字为RevertNum.c的程序,代码如下:

#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);
}

上面的代码实现对一个整型数的反转功能,比如输入123,则输出321。 但输入100时,程序的输出结果却不正确,我们通过GDB调试来找出错误。

2.用Gcc编译,代码如下:

gcc -o RevertNum -g RevertNum.c

3.我们接下来启动gdb

gdb RevertNum

在这里插入图片描述

4.我们可以输入l ,就可以显示代码及行号
在这里插入图片描述

这里小编第一次只出现看子函数,而没有出现主函数,可以输入list,主函数就出来了

在这里插入图片描述
5.通过行号设置断点

在这里插入图片描述
6.通过函数名设置断点
在这里插入图片描述

7.查看断点所有断点信息
在这里插入图片描述
8.执行程序
在这里插入图片描述
9.查看INum的类型和值
在这里插入图片描述
10.继续执行程序
在这里插入图片描述
这里小编的INum的值却变成了21845,但我出去运行了一下程序却得到 了正常的结果
在这里插入图片描述
如果有大佬知道怎么回事,希望私信我,感激不尽。
11.单步调试
在这里插入图片描述

单步调试可以一步一步查看,找到错误。

段错误调试

1.程序
在这里插入图片描述
2.调试
在这里插入图片描述
在这里插入图片描述
修噶爱变量的值
在这里插入图片描述
单步执行
在这里插入图片描述
即可得到正确答案。
3.
• Linux中,程序崩溃时,一般会产生core文件,记录进程退出前
的状态,调试段错误问题,借助于该文件,可快速定位问题。
• 可按如下步骤生成和使用core文件
– Step 1: 让系统产生core文件
• ulimit –c num #设定core文件容量(num为数字,为0
是不产生core文件) – Step 2: 运行程序,让程序崩溃,从而生成core文件
– Step 3: gdb配合core文件,定位问题
• gdb 程序名 core文件名
• 比如: gdb segDemo core
在这里插入图片描述

心得

通过本次实验,我基本上掌握了GDB调试的方法,这有助于我以后在程序出错的时候可以通过调试找到错误,不用一行一行去看代码找错误了。

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页