GDB简明教程

声明:本博客内容是由本人经过实验楼教程整理得来。

GDB的相关概念

GDB, 是 The GNU Project Debugger 的缩写, 是 Linux 下功能全面的调试工具。GDB 支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序。

GDB的相关操作

下面给出一个具有buging.c的程序:

[yqtao@localhost linux]$ cat buging.c 
#include <stdio.h>
int getSum(int n) {
        int sum=0,i;
        for (i=1;i<=n;i++)
                sum+=i;
        return sum;
}
int main(){
        int res=getSum(100);
        printf("1+2+...+100=%d\n",res);
}

如果要调试程序,则在进行gcc编译的时候要加上-g参数
gcc -g -o bugging bugging.c

进入gdb:

gdb buging

部分gdb命令:

这里写图片描述

// 查看源码
// 查看第几行附近
// 可简写成l 2
(gdb) list 2      
1       #include <stdio.h>
2       int getSum(int n) {
3               int sum=0,i;
4               for (i=1;i<=n;i++)
5                       sum+=i;
6               return sum;
7       }

// 查看main函数附近的源码
(gdb) list main
3               int sum=0,i;
4               for (i=1;i<=n;i++)
5                       sum+=i;
6               return sum;
7       }
8       int main(){
9               int res=getSum(100);
10              printf("1+2+...+100=%d\n",res);
11      }


// 设置断点
// break +n在第几行设断点
(gdb) break 8
Breakpoint 1 at 0x4004fa: file buging.c, line 8.
// break +函数名 ,在函数名处设断点
(gdb) break getSum
Breakpoint 2 at 0x4004cb: file buging.c, line 3.

//查看断点信息
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fa in main at buging.c:8
2       breakpoint     keep y   0x00000000004004cb in getSum at buging.c:3

断点信息中每一项的信息:

  1. Num 列代表断点编号,该编号可以作为 delete/enalbe/disable 等控制断点命令的参数
  2. Type 列代表断点类型,一般为 breakpoint
  3. Disp 列代表断点被命中后,该断点保留(keep)、删除(del)还是关闭(dis)
  4. Enb 列代表该断点是 enable(y) 还是 disable(n)
  5. Address 列代表该断点处虚拟内存的地址
  6. What 列代表该断点在源文件中的信息
// 删除断点
// delete +n 或 d +n
// 如果不加数字则删除全部的断点
(gdb) d 2
(gdb) info breakpoints 
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fa in main at buging.c:8

关闭和启用断点:

有时候,我们会遇到这种情况:有些断点可能暂时不用但又不想删除,那么可以disable.

disable +n  //关闭断点
enable +n   //启动断点

GDB单步调试

以本文开头的buging.c文件为例,进行单步调试。

// 进入gdb
[yqtao@localhost linux]$ gdb buging
// 在main()函数处设断点
(gdb) info breakpoints 
// 运行程序
(gdb) run
Breakpoint 1, main () at buging.c:9
9               int res=getSum(100);

注意:我们要进入函数要是用step(s),而单步执行next(n),next是不进入函数内部的,要区分两者的关系。

(gdb) step
getSum (n=100) at buging.c:4
4               for (i=1;i<=n;i++)
// 查看代码
(gdb) l
1       #include <stdio.h>
2       int getSum(int n) {
3               int sum=0,i;
4               for (i=1;i<=n;i++)
5                       sum+=i;
6               return sum;
7       }
8       int main(){
9               int res=getSum(100);
10              printf("1+2+...+100=%d\n",res);
// 下一步
(gdb) s
5                       sum+=i;
// 打印sum的值
// 看到sum是为赋初值的
(gdb) p sum
$1 = 4195633
// info locals
//打印当前断点处所在函数的所有局部变量的值,不包括函数参数。
(gdb) info locals
sum = 4195635
i = 3

其余的一些命令:

finish
执行程序到当前函数结束

continue
执行程序到下个断点

until
until N,执行程序到源代码的某一行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值