当前位置: 首页 > news >正文

【Linux系统】C/C++的调试器gdb/cgdb,从入门到精通

在这里插入图片描述
各位读者大佬好,我是落羽!一个坚持不断学习进步的学生。
如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步!

也欢迎关注我的blog主页: 落羽的落羽

文章目录

  • 一、调试前的预备知识
  • 二、gdb/cgdb的使用
    • 1. 启动,查看代码
    • 2. 基础调试命令
    • 3. 监视变量相关命令
    • 4. 设置条件断点

一、调试前的预备知识

程序发布的方式有两种,debug模式和release模式。

  • debug模式:生成的可执行程序中会包含程序的调试信息,便于程序员进行调试代码。
  • release模式:会剥离或不生成这些调试信息。这使得文件更小,但也意味着调试器几乎无法工作,release版本程序无法进行调试。

Linux的gcc/g++,按照我们之前的写法gcc -o $@ $^,默认生成的是release版本的程序,是无法进行调试的。要在命令后加-g选项,指定以debug方式发布,debug模式下的程序我们才能进行调试。

gcc -o $@ $^ -g  

二、gdb/cgdb的使用

1. 启动,查看代码

开始使用gdb/cgdb调试,首先要确定系统里已安装gdb/cgdb,其次要调试的程序确定是debug版本的。

gdb 文件名

在这里插入图片描述

gdb和cgdb中,需要用各种指令完成调试过程的不同操作:

  • 退出调试:ctrl + d或输入quit回车

使用gdb,一开始是看不到我们的代码的,要使用l相关命令:

  • 输入(list)l:显示源代码,每次显示10行
  • 输入l 函数名/文件名:列出指定函数/指定文件的代码
  • 输入l 文件名:行号:列出指定文件以某一行为中的几行代码
    在这里插入图片描述

但是,实际开发中要靠自己显式出代码,还是很麻烦。因此cgdb诞生了,cgdb是gdb的前端界面增强版本,能够直接将代码显示在屏幕上面,初次之外其他命令操作没有区别:

在这里插入图片描述

后面我们就在cgdb中进行演示了。

2. 基础调试命令

  • 命令(run)r:开始调试,从程序开始执行,调试中途随时可以输入r重头调试
  • 命令(break)b [文件名:]行号:在指定行号设置断点
  • 命令info b:查看当前所有断点的信息
  • 命令d:删除所有断点
  • 命令d 断点序号:删除指定序号的断点

断点会在行号处标明:
在这里插入图片描述

每一个断点都有一个序号,通过info b查看,删除指定断点需要指明这个序号,而不是断点的行号:

在这里插入图片描述

  • 命令(continue)c:从当前位置开始连续执行程序,到下一个断点
  • 命令(next)n:单步逐过程执行,遇到函数时不进入函数内部
  • 命令(step)s:单步逐语句执行,遇到函数时进入函数内部
  • 命令(finish)f:执行到当前函数返回时
  • 命令until 行号:执行到指定行号

gdb/cgdb中,回车自动执行上一条命令

3. 监视变量相关命令

在调试过程中,我们经常需要观察一个变量的值:

  • 命令(print)p 变量/表达式:打印出变量/表达式的值。

  • 命令set var 变量 = 值:修改一个变量的值

  • 命令display 变量:持续显示一个变量的值

  • 命令undisplay 变量序号:取消对指定序号的变量的持续追踪显示

  • 命令watch 变量:监视一个变量的值,如果该变量的值在程序运行期间发生变化,cgdb会暂停程序的执行并通知用户。这一命令常用在,如果有不应该被修改的变量,你怀疑他被修改了,就可以watch他。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4. 设置条件断点

一个断点,也可以为其设置触发的条件。

b 位置 if 条件  #条件满足时,断点才会生效

举个栗子:b 10 if i == 5,表示在第10行新增一个断点,只有 i == 5 时才会生效

在这里插入图片描述

也可以给一个已存在断点新增触发条件:

condition 断点序号 条件

在这里插入图片描述

非常好理解!

本篇完,感谢阅读

http://www.dtcms.com/a/564551.html

相关文章:

  • 从被搜索到被推荐:GEO重塑可见性逻辑
  • 如何为 Oracle 数据库配置 TLS/TCPS
  • 阿里云网站备案注销吗大数据做网站
  • pc网站做app京东湖北网站推广服务
  • 测试环境与正式环境同样的机器显示不同的网络问题
  • HTTP_HTTPS协议
  • Linux高效备份:tar与gzip完全指南
  • Java中的File类
  • 四、Linux设备驱动介绍
  • 视频生成模型发展历程:从GAN到Sora的技术革命之路
  • SQL之表的查改(下)
  • CV论文速递: 覆盖医学影像分析、视频理解与生成、3D场景理解与定位等方向! (10.27-10.31)
  • Redis(四):缓存击穿及其解决方案(SpringBoot+mybatis-plus)
  • 突破局域网限制,Websocket 服务远程访问cpolar新方案
  • 科普网站建设方案网站容易被百度收录
  • 深圳营销网站建设服务wordpress 语言选择器
  • 广西建设厅关公网站中国能建电子商务平台
  • 9.OpenStack管理(三)
  • 大模型应用02 || 检索增强生成Retrieval-Augmented Generation || RAG概念、应用以及现有挑战
  • 【春秋云镜】CVE-2018-19518
  • [手机AI开发sdk] 安卓上的Linux环境
  • Pandas-之时间序列处理
  • 用 Spark Shell 做交互式数据分析从入门到自包含应用
  • WindowsXP Window7等老系统和Linux Ubuntu等系统在VM虚拟机中安装VM Toools工具实现宿主机虚拟机共用粘贴板
  • 第十二章:终极叩问:我是谁,我往何方?(3)
  • 校园网站建设的缺陷怎么做考试资料网站
  • 【Android Studio】webview 组件在android TV中进行加载,始终是客户端网页的方式进行加载,解决?
  • 应对不规则负载的异步ML模型服务AWS架构设计
  • Docker、Kubernetes与AWS中控机是什么?
  • AWS Bedrock + DeepSeek-R1:开启企业级 AI 开发的新篇章