首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux探秘坊-------6.gdb

Linux探秘坊-------6.gdb

作者头像
hope kc
发布2025-02-08 13:56:03
发布2025-02-08 13:56:03
12500
代码可运行
举报
文章被收录于专栏:学习学习
运行总次数:0
代码可运行

1.debug和release模式

我们开发内容时的模式一般为debug模式,方便我们进行调试,而release一般是不支持调试的。

而Linux下的gcc/g++默认都是release环境,是没办法直接用gdb调试的,那么有什么解决办法嘛?

有的,兄弟有的: 在我们之前自己编写的makefile文件中:加入-g

这样make出来的可执行程序就满足进行调试的要求哩

2.认识gdb

先创建一个mycode.c

用vim写入:区间求和小程序

代码语言:javascript
代码运行次数:0
运行
复制
#include <stdio.h>
int Sum(int s, int e)
{
 int result = 0;
 for(int i = s; i <= e; i++)
 {
 result += i;
 }
 return result;
}
int main()
{
 int start = 1;
 int end = 100;
 printf("I will begin\n");
 int n = Sum(start, end);
 printf("running done, result is: [%d-%d]=%d\n", start, end, n);
 return 0;
}

这里会显示有错误,因为C89里int是不能放在for循环里的,需要改成:

  • gcc mycode.c -o mycode.c -std=c99 -g
  • 记得一定要加-g,不然就没法调试哦!!!!
  • 输入quit即可退出gdb

3.gdb命令详解

有兄弟发现gdb好难用呀,有木有更加简单好用的呢? 有的,兄弟有的: 安装cgdb

  • sudo yum install -y cgdb
1.行号,断点和断点查看

先使用cgdb+可执行程序名进入cgdb

  • 上面是代码区
  • 下面是debug区

指令罗列:

    1. b+行号 给某一行打断点

可见代码区第五行被标红,说明第五行被打了断点

  • 2.info b 查看断点与断点编号

显示断点编号为1,位置为mycode.c的第五行

  • 3.d + 断点编号(不是行号!!!!!!) 删除断点

info b 显示没有断点了

    1. run 运行程序(有断点就停下来)
    1. l + 文件名:行号
2.逐语句和逐过程
  • 当前我设置了一个断点,可以看到断点行有一个函数。

走函数还是不走函数呢?

  • n ---------- 不进入函数

直接走到第17行,跳过函数

  • s-------------- 进入函数

可以看到,输入s就进入到了函数内部

3.finish,p,disable,enable

初始位置在第16行(打断点的位置)按下s后进入函数,再按下finish就直接走完函数进程,回到第16行。

  • finish -----------走完函数进程
  • p + 变量名(也可以是表达式!!!!) -------------------打印变量名的值
  • disable + 断点编号---------使断点无效但不删除断点,(可见断点处变黄)
  • enable + 断点编号 --------------使断点复原
4.c,until ,display,undisplay
  • c -------------从一个断点跳到另一个断点
  • until + 行号n----------从 当前行 直接执行到 第n行
  • display + 变量名---------------------在 每次gdb操作后都在屏幕上显示变量名的值
  • undisplay + 变量名编号----------------取消display的功能

4.三个调试小技巧

1.watch+变量————————变量发生变化时会提醒
  • 这里我用watch标记了“result”
  • 发现一旦result发生改变时就会发出提醒————并提供原值和新值

删除方式和删断点一致

2.set var+变量= … ————————仅在调试过程中改变变量的值,但退出gdb后值不改变
  • 这里用 p 查出原来result值为5050,使用 set var result =1,改变了result的值,得出运行结果为1
3.b + 行号 + if (条件)————————在某行设置条件断点
  • 在第 7 行设下条件断点
  • 可知i==10时,result为45
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-02-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.debug和release模式
  • 2.认识gdb
    • 先创建一个mycode.c
  • 3.gdb命令详解
    • 1.行号,断点和断点查看
    • 2.逐语句和逐过程
    • 3.finish,p,disable,enable
    • 4.c,until ,display,undisplay
  • 4.三个调试小技巧
    • 1.watch+变量————————变量发生变化时会提醒
    • 2.set var+变量= … ————————仅在调试过程中改变变量的值,但退出gdb后值不改变
    • 3.b + 行号 + if (条件)————————在某行设置条件断点
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档