Linux简单gdb使用于调试

1.进入与退出

进入:gdb + 可执行程序
退出:quit
在这里插入图片描述

2.Linux下的debug和release:

1.如果一个程序是可以被调试的,该程序的二进制文件一定加入了一些debug信息
2.vs中发布程序的时候,通常有两种发布方案:debug和release
3.release没有包含调试信息
4.centos中,默认形成的可执行程序是release
5.如果想要调试: gcc test.c -o test -g

在这里插入图片描述
从上图中可以看出debug下的test比release占用的空间大一点
此时无论运行上面的debug还是release都没问题

3.开始测试

1.先写一个可调试的程序

在这里插入图片描述
即方便复制调试:

#include<stdio.h>    
    
int SumToTop(int top)    
{    
  int sum = 0;    
  for(int i = 1;i<= top;++i)    
  {    
    sum+=i;    
  }    
  return sum;    
}    
    
int main()    
{    
  int top = 100;    
  int res = SumToTop(top);    
                                                                                                                                                                                                                 
  printf("res = %d\n",res);    
  return 0;    
}    

然后退出编译
在这里插入图片描述
此时我们运行这个test
在这里插入图片描述
如果我们需要这个程序能够调试则需要
-g

2.开始调试

在这里插入图片描述
在这里插入图片描述
注意:有时候调试的时候会出现一些报错,这些报错不会影响调试,所以不需要去管

3.调试指令详解(按照一个程序正常调试步骤进行解释)

我们在自己的常用编译器上输入我们的test.c(我这里用的是vs2019,两者对比能够更好理解)

1. r/run = ctrl+F5(开始执行不调试)

在vs中,最开始按
F10
会进入调试,并进入int main的下一行
继续F10就会逐过程逐语句的进行

在VS中,大多数情况下我们会给代码打断点,然后
F5
就会从断点处开始进行调试

总之我们都需要将代码跑起来,然后调试
在这里插入图片描述

在这里插入图片描述

2. list/l 显示代码

在这里插入图片描述

延伸补充:
这个l一次显示十行代码
l后面加数字会得到这个数字的前五个和后四个的位置所有代码即:
在这里插入图片描述

3.打断点 b

可以根据函数名打,也可以根据行号打(常用)
b+行号
在这里插入图片描述
翻译:
一号断点打在 0X40056a
文件test.c
行号是16

4.查看打的断点 info b

在这里插入图片描述
显示我们打的断点
断点编号,类型, ,enb是否开启,地址,在哪打的断点

5.继续跑 r

在这里插入图片描述

6.逐语句(s/step)或者逐过程(n)

在这里插入图片描述

逐过程:
比如代码中我们写的循环,变量,我调用的函数等等
不会进入这个
而是以分号为结束语句
即:不会进入函数,而是把函数当作一个语句进行调试

逐语句正好相反,所以不做解释

需要注意:
我们进入for循环时,s和n的效果都一样都是逐语句进行(也符合我们的日常操作)

7.监视 display+变量

在这里插入图片描述

display + 变量 (查看具体变量的值)
在这里插入图片描述
display + &变量(查看变量的地址)
在这里插入图片描述
此时我们再s或者n每次显示的时候就会显示这些监视的值

8.只想看一次这个变量的值 P或者p

在这里插入图片描述

9.删除长显示 undisplay+序号 序号 序号

可以一次删除一个监视,或者多个监视
在这里插入图片描述
可以看到我们的监视有序号1 2
所以(删除&sum)
在这里插入图片描述

10.结束当前函数 finish

当我们进入一个函数中的循环时,我们已经发现这个循环是对的,可以用finish进行跳出循环,并直接返回结果,即:
在这里插入图片描述

11.再打断点b + 行号

先用l查看代码,然后b打断点

因为1号断点我们已经运行了一次,所以会出现
breakpoint already hit 1 time

12.跳到下一个断点处 continue/c

下图解释:
先重新跑一次,跑到1号断点处
进入循环
我们发现这个循环没问题,就可以continue进入下一个断点
在这里插入图片描述

13.跳出循环until

方法一:
在10 行处打一个断点,然后continue
方法二:
until
在这里插入图片描述

14.删除断点 d + 断点编号

在这里插入图片描述

15.不删掉断点,但是保存断点 disable+断点编号

在这里插入图片描述

16.打开disable的断点 enable+断点编号

在这里插入图片描述

17.查看各级函数调用及参数 bt/breaktrace

下图解析:
查看函数调用堆栈的信息
在这里插入图片描述

vs vs2019在这里插入图片描述
在这里插入图片描述

18. 改变调试时中的某些变量的值 set var 变量=修改值

在这里插入图片描述

  • 32
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值