准备操作:

假设以下操作被调试的程序内容如下:
文件名为: main.c

#include <stdio.h>

int main()
{
    int i = 0;

    for(i=0; i<3; i++)
    {
        printf("%d\n", i);
    }

    return 0;
}

简单调试 - 图1

编译:

gcc -g main.c

为了方便gdb调试,我们需要加上-g选项,默认生成的调试文件为 a.out ;
从下图我们可以看到编译gcc -g 编译之后的文件中多了一个 a.out 绿色表示可执行;

简单调试 - 图2

启动被调试程序:

gdb ./a.out
或
gdb a.out

下图为 启动并运行(r) 之后的效果:

简单调试 - 图3


其中 r 表示 run, 就是运行的意思,使用 r 之后,如果中间没有设置断点或遇到错误就会一直执行完毕。

常用的几个命令

下面的命令举例,均以上面的代码为例,分别在第3行和第5行代码位置处设置断点。

  • b
    break 设置断点
    格式:

    b 函数名 或 行号

    简单调试 - 图4

  • delete 行号
    删除一个断点或监测点

  • info b
    info break 查看当前已经设置的断点
    简单调试 - 图5

  • list
    查看源码,并每行对应的行号

    简单调试 - 图6

  • man gdb
    查看 gdb 常用命令语法

  • n
    next 单步调试

  • p 变量名
    print 打印变量的值

  • r
    run 运行

  • s
    step 进入子函数

  • set logging on
    打开日志模式;
    记录当前的gdb输出到当前目录的文件gdb.txt中;

  • start
    开始执行程序,在main函数前停下来。

  • watch * 变量地址
    watch 变量
    设置需要观察的变量前后值的变化情况;
    info watchpoints
    开启查看已设置过的变量,目前来看不使用该句也可以查看。
    注意:只有当调试的过程中,遇到其变化时才会显示出来。

  • quit
    退出

常用参数:

  • -p 进程ID号
    调试正在运行的程序;