linux环境中gdb调试工具的使用

什么是GDB,能干啥?
 gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。

一般来说,GDB主要帮助你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)

3、当程序被停住时,可以检查此时你的程序中所发生的事。

4、你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

GDB调试的对象
 GDB主要来调试C/C++语言写的程序,当然也就可以调试其他语言程序。这里我们只说C/C++(其他语言我也不会呀)
GDB调试一定要是可执行文件而不是.c文件

注意编译时候要加上-g,添加调试信息

GDB常用的调试命令
(gdb)help:查看命令帮助,具体命令查询在gdb中输入help + 命令,简写h

(gdb)run:重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件),简写r

(gdb)start:单步执行,运行程序,停在第一执行语句

(gdb)list:查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数),简写l

(gdb)set:设置变量的值

(gdb)next:单步调试(逐过程,函数直接执行),简写n

(gdb)step:单步调试(逐语句:跳入自定义函数内部执行),简写s

(gdb)backtrace:查看函数的调用的栈帧和层级关系,简写bt

(gdb)frame:切换函数的栈帧,简写f

(gdb)info:查看函数内部局部变量的数值,简写i

(gdb)finish:结束当前函数,返回到函数调用点

(gdb)continue:继续运行,简写c

(gdb)print:打印值及地址,简写p

(gdb)quit:退出gdb,简写q

(gdb)break+num:在第num行设置断点,简写b

(gdb)info breakpoints:查看当前设置的所有断点

(gdb)delete breakpoints num:删除第num个断点,简写d

(gdb)display:追踪查看具体变量值

(gdb)undisplay:取消追踪观察变量

(gdb)watch:被设置观察点的变量发生修改时,打印显示

(gdb)i watch:显示观察点

(gdb)enable breakpoints:启用断点

(gdb)disable breakpoints:禁用断点

(gdb)x:查看内存x/20xw 显示20个单元,16进制,4字节每单元

(gdb)run argv[1] argv[2]:调试时命令行传参

现在我们来现场实操一个例子,实践一下gdb调试工具

现在编写了一个简单的C语言代码

int main(void)
{
        int a=5;
        a+=10;
        return 0;
}

这里有几个需要注意的点,并不是写C语言一点要加上头文件的,
有些同学写C语言第一件事就是#include<xxxxxx.h>
这样只会将我们的.c文件变得 " 臃肿 " ,我们只有需要用的时候加上就好了

我们要进行调试就需要编译成可执行文件,编译时候加上-g
gcc test.c -g

两种方式启动gdb

  1. gdb + 可执行文件名
  2. 在shell命令行条件下输入gdb,进入输入file + 可执行文件名

启动gdb的画面是这样的
在这里插入图片描述

启动以后进行我们想要的操作,调试无非不就是打断点,查看寄存器,指针,变量等信息

我们先来打个断点,这时候看不到代码,我们并不知道怎么去打断点,所以我们可以输入list显示代码,
如果一次性显示不完可以输入两次list
在这里插入图片描述

b   行号     
b    函数名

打完断点我们可以查看断点的信息
在这里插入图片描述
输入r (run)开始运行
当运行到断点的时候程序会停下来,显示当前所在的行以及源码
在这里插入图片描述
同样我们可以输入一些打印命令来进行调试,输入n (next),运行下一行代码
在这里插入图片描述

这里介绍一个 除了基本打断点的另外一种方法,watchpoint,用来监视一个内存地址是否被读写,使用watchpoint的前提是运行这个程序,
打了断点,输入r之后查看某变量的地址(要观察的地址空间),然后输入

watch *0x7fffffffdf4c  //其中地址前要加*

同样也可以查看watchpoint的情况,操作如图:
在这里插入图片描述

调试core文件

一般我们调试的程序有两种
一种是上面的可执行文件,还有一种是发生段错误生成core文件
现在我们有一个很简单的程序

#include<stdio.h>
int main(void)
{
        int *p=NULL;
        p=9;
        return 0;
}


简单学习过C语言指针的同学都知道,指针这么赋值将会发生异常,现在我们来运行一下
在这里插入图片描述
这个错误想必是大家最恶心的错误,我们怎么办呢?
我们需要去调试core文件,但是我们看了一遍,当前目录没有core文件,那怎么办呢?

这里有几种方法原因

在linux平台下,设置core dump文件生成的方法:

1) 在终端中输入ulimit -c 如果结果为0,说明当程序崩溃时,系统并不能生成core dump。

2) 使用ulimit -c unlimited命令,开启core dump功能,并且不限制生成core dump文件的大小。如果需要限制,加数字限制即可。ulimit - c 1024

3) 默认情况下,core dump生成的文件名为core,而且就在程序当前目录下。新的core会覆盖已存在的core。通过修改/proc/sys/kernel/core_uses_pid文件,可以将进程的pid作为作为扩展名,生成的core文件格式为core.xxx,其中xxx即为pid

4) 通过修改/proc/sys/kernel/core_pattern可以控制core文件保存位置和文件格式。例如:将所有的core文件生成到/corefile目录下,文件名的格式为core-命令名-pid-时间戳. echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern

这里我们使用第二种方法就可以解决问题了
在这里插入图片描述
现在我们可以看到已经生成了core文件,我们将利用这个文件进行调试
在这里插入图片描述
当我们启动gdb调试时候直接跳到发生异常的地方,并且告诉我们原因,我们根据这个提示去改代码就可以了
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值