博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于Ubuntu的嵌入式开发练习(四)学习如何使用GDB来调试程序
阅读量:319 次
发布时间:2019-03-04

本文共 2275 字,大约阅读时间需要 7 分钟。

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

目录

一、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 终止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给调用者

三、实例练习(一)

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

#include 
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时会出错,让我们来寻找错误吧。

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

在这里插入图片描述

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

在这里插入图片描述

  1. 调试完后,通过quit退出
    在这里插入图片描述

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

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

#include 
#include
#define BUFSIZE 256static 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设断点来调试了

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

    在这里插入图片描述
    在这里插入图片描述

  2. 我们先看看pStr的值

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20201023210000373.png#pic_center

  3. 查看代码并下断点

    在这里插入图片描述

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

    再

  5. 单步执行,就可以输出了

    在这里插入图片描述

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

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

转载地址:http://yahq.baihongyu.com/

你可能感兴趣的文章