一文看懂gdb简单调试

https://blog.csdn.net/unix21/article/details/9991925

gdb可视化调试:gdb -tui -q 可执行文件的名字


1.gdb编译/启动/退出/传参/查看源代码

  1. gdb编译程序
    使用gcc编译程序生成可执行文件的命令中,加上-g参数

  2. 启动gdb调试程序
    gdb 可执行程序

  3. 退出gdb调试
    在gdb中输入quit(q)

  4. 命令行传参
    set args ___ ___ ___

  5. gdb查看源代码:list(l)
    [1] listsize显示设置
            默认情况下,显示list的上下各10行
            list showsize #执行l命令,默认显示几行
            set listsize 20 #设置显示的行数为20
    [2] list(l)的使用
            list 文件名:行号
            list 文件名:函数名

2.断点相关命令

  1. 设置断点:break(b)
    b 文件名:行号
    b 文件名:函数名

  2. 条件断点
    b 行号 if 变量==var
    例:b 17 if i==10 表示:在第17行打断点,当i==10条件成立时,程序停在断点处

  3. 查看设置过的断点info(i) b

  4. 删除断点:del(d) 断点编号Num
    del num1 num2 … numN
    del numK1-numK2

  5. 将断点设为[无效]:disable(dis) 断点编号Num

  6. 将断点设为[有效]:enable(ena) 断点编号Num

3.代码调试相关命令

  1. 启动并执行程序,停在程序的第一行:start

  2. 启动并执行程序,停在断点break处:run®

  3. 查看变量的值:print§ 变量

  4. 查看变量的类型:ptype 变量

  5. 在程序执行的过程中,实时自动地显示变量的值:dispaly i
    取消实时自动地显示变量的值:
    info(i) display
    undisplay 编号Num

4. 常用调试

  1. gdb -p {进程号}
    ① 根据进程名,获取进程号码:pidof {进程名} --> 进程号
    ② 开启gdb调试:gdb {进程号}
    说明:gdb {进程号},会先杀死该进程,然后重启进程&进入gdb调试环境。

  2. 打断点技巧
    (1) b {代码文件}:函数名,例: b test.c:main
    (2) b {代码文件}:行号,例:b test.c 12

  3. 查看断点信息:info b

  4. commands:命令列表 (依赖于断点)
        每次断点发生时候,想要查看的变量很多时,如果每个变量都手动print则需要浪费很多时间。断点命令可以在断点发生时批量执行gdb命令。
        commands的设置步骤
    ① 打断点
    ② commands(开启commands)
    ③ > 命令1
    ④ > 命令2
    ⑤ > end (结束commands)

(gdb) l
1       #include <stdio.h>
2
3       int main()
4       {
5               int i;
6               for(i=0;i<100;i++)
7                       ;
8
9       }
10
(gdb) b 7    # 打断点
Breakpoint 1 at 0x4004c3: file main.c, line 7.
(gdb) i b    # 查看断点信息
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004c3 in main at main.c:7
(gdb) commands 1   # 开启commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>p i    # commands中的命令行
>end    # 结束commands
(gdb) i b  # 查看断点详情,多了个p i
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004c3 in main at main.c:7
        p i
(gdb)
  1. 监视器(某个变量发生变化时,将自动打印,不依赖于断点
        可以监视某个变量,在变量被访问或者被修改时程序会在当前点进入断点。
    ① start 先启动
    ② watch {要监视的变量}

向下走,程序停在下一个断点:continue©

向下走一步,不会进入函数体:next(n)
向下走一步,会进入函数体:step(s)
跳出函数体:finish

从循环体直接跳出:until

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值