Linux调试器GDB使用

例程

#include <stdio.h>
int cal(int n)
{
    if (n == 1)
        return 1;
    else
        return n * cal(n - 1);
        
}


int main()
{
    int n = 5;
    n = cal(n);
    printf("%d", n);
    return 0;
}

gcc -g demo_gdb.c -o demo_gdb

参数 g 作用是把调试信息加入到生成文件中,否则GDB是无法调试的

开始调试

eselnts1615 [18:13] [/000test/linux] -> gdb demo_gdb
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-114.el7
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/000test/linux/demo_gdb...done.
(gdb)

进入等待调试窗口

几个常用的命令

(1)查看源文件

gcc可以给出产生警告或者错误的代码行数
l (list的缩写)

(gdb) l
4           if (n == 1)
5               return 1;
6           else
7               return n * cal(n - 1);
8               
9       }
10
11      int main()
12      {
13          int n = 5;
(gdb) l
14          n = cal(n);
15          printf("%d", n);
16          return 0;
17      }
18
(gdb) l
Line number 19 out of range; demo_gdb.c has 18 lines.

以10为单位进行显示,在运行一次就显示下边10行

(2)设置断点

通过断点可以知道每一步的执行情况(当前变量的值,函数是否调用,堆栈使用情况)

在第七行设置断点,输出该断点在内存中的物理地址

(gdb) b 7
Breakpoint 1 at 0x400535: file demo_gdb.c, line 7.
(3)查看所有断点
(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x0000000000400535 in cal at demo_gdb.c:7
(4)运行程序

r(run的缩写),默认从代码首行开始运行,如果又断点,会在断点的前一行暂定运行

(gdb) r
Starting program: /home/elixkan/elixkan/000test/linux/demo_gdb


Breakpoint 1, cal (n=5) at demo_gdb.c:7
7               return n * cal(n - 1);
(5)查看变量值

程序暂停后可以查看当前的状态,p(print的缩写)可以查看当前变量n的值

(gdb) p n
$1 = 5

显示的方式是“ N ” 来 显 示 变 量 的 值 , 下 次 查 看 变 量 的 时 候 , 就 可 以 直 接 使 用 “ N”来显示变量的值,下次查看变量的时候,就可以直接使用“ N使N”代替变量名了

(6)继续运行程序

参数c可以继续运行,由于cal函数是递归调用,程序会再次在断点处停止

(gdb) c
Continuing.


Breakpoint 1, cal (n=4) at demo_gdb.c:7
7               return n * cal(n - 1);

暂停后可以继续查看变量n的值

(gdb) p n
$2 = 4
(7)单步运行

复杂的函数有时候需要一步步运行,s(step的缩写) n (next的缩写)
s可以进入函数内部运行,但是n 不会进去

(gdb) s
cal (n=4) at demo_gdb.c:4
4           if (n == 1)
(gdb) s


Breakpoint 1, cal (n=4) at demo_gdb.c:7
7               return n * cal(n - 1);
(gdb) s
cal (n=3) at demo_gdb.c:4
4           if (n == 1)
(gdb) s


Breakpoint 1, cal (n=3) at demo_gdb.c:7
7               return n * cal(n - 1);
(gdb) s
cal (n=2) at demo_gdb.c:4
4           if (n == 1)
(gdb) s

Breakpoint 1, cal (n=2) at demo_gdb.c:7
7               return n * cal(n - 1);

关注我

我的首发平台是【CodeAllen】,欢迎关注并回复“1024”进入资料群获取免费学习资料
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeAllen嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值