GuguMelon's Blog

今天所做之事勿候明天,自己所做之事勿候他人。

0%

gdb使用小结

写在前面

妈妈再也不用担心我离开$IDE$就不会敲代码啦!

对于$gdb$功能的基础介绍

  • 设置断点
  • 逐行执行代码
  • 查看变量的值

基础使用

首先我们在$gcc$程序的时候需要添加$-g$选项

1
2
//本文仍以test.c为例
gcc -g test.c -o test

此时生成的$test$便可通过$gdb$调试辣!

我们执行

1
gdb test

会发现出现了多行信息,只需要添加$-q$,世界会瞬间变得清净起来。

踏入了$gdb$的世界,下面让我们来具体学习一下操作吧!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
file 文件名 //装载文件,如果是直接gdb进入而没有附加文件,则调试前需要装载文件
list begin,end //展示从begin行到end行的代码,若没加行数限制则默认每次展示10行,回车继续展示
b(reak) num //在num行设置断点
b(reak) 文件名:函数名
r(un) //运行
p(rint) var //输出变量的值
c(ontinue) //继续执行
n(ext) //下一行
s(tep) //下一行,与next区别为会进入函数内部
set var= //修改变量值
breakpoints //查看断点
disable num//使第num行的断点失效
enable num //使第num行的断点生效
delete num//删除num行的断点
delete //删除所有断点
kill //停止当前进程
q(uit) //退出gdb

上面便是我们常用的$gdb$的基本操作辣!

你是不是还有一个疑问呢?如果发生段错误(内存错误)我们怎么知道是哪里出了问题呢?

这就涉及到一个新的知识点。

利用$gdb$和$core dump$快速定位段错误

内存错误的程序通常会崩溃掉,即$coredum$(核心转储),这时候会有一个镜像文件留存下来,即$core$,我们可以从其中找到内存错误的代码片段。

比如这段错误的代码。

1
2
3
4
5
6
7
8
#include<string.h>
#include<stdio.h>
int main()
{
char *s;
gets(s);
puts(s);
}

运行后,结果为

去同目录下找$core$文件,可能会找不到,因为默认空间设置为0,我们给空间设置为1000。

即执行

1
ulimit -c 1000

然后执行

1
gdb -q err core

会得到

我们通过$bt$命令便可以查看错误的点的信息(具体行数)

如图所示

以上。