【Linux篇】调试器-gdb/cgdb使用

📌 个人主页: 孙同学_
🔧 文章专栏:Liunx
💡 关注我,分享经验,助你少走弯路!
在这里插入图片描述

文章目录

    • 1. 前言
    • 2.关于gdb
      • 2.1 快速认识gdb
      • 2.2 安装cgdb
      • 2.3 gdb命令
      • 2.4 调试 & 断点
    • 3.常见技巧
      • 3.1 watch
      • 3.2 set var确定问题原因
      • 3.3 条件断点

1. 前言

软件发布的模式有两种,一种是debug模式,另一种是release模式,一般程序员写软件都是在debug模式下的,如果软件写好,并且自测也通过的话发布软件是在release模式下发布的。比如我们手机应用,电脑应用的发布模式都是release模式。程序员写完一个软件的代码,交给测试员测试都是把release版本交给测试的,测试通过就会发布给用户去使用。但Liunx下编写好的代码无法直接测试,因为gcc/g++默认的模式是release模式。

  1. 我们要想我们的程序在debug模式下运行的话,我们就需要在翻译的时候加上-g选项
    在这里插入图片描述
  2. 保存退出后我们再次make一下重新形成了可执行程序
    在这里插入图片描述
    在这里插入图片描述
    上面是没有加-g选项的,下面是加了的,我们会发现下面的可执行程序的体积大于上面的,下面的就是debug版本
    所以-g选项,让最后形成的可执行程序添加调试信息—debug模式!程序要调试,必须是debug模式!

2.关于gdb

2.1 快速认识gdb

  1. 我们首先生成一个mycode可执行程序,然后进行gdb mycode就进入到gdb里面了
    在这里插入图片描述
    quit+回车就退出来了

2.2 安装cgdb

cgdbgdb本质上是一摸一样的,只不过cgdb能够把我们的代码动态呈现出来

• Ubuntu:sudo apt-get install -y cgdb 
• Centos:sudo yum install -y cgdb

在这里插入图片描述
cgdb的上面是我们的代码,下面是我们的调试信息📌:cgdb分屏操作Esc进入代码屏,i回到gdb

l mycode.c:1:从第一行开始显示

2.3 gdb命令

  1. list:查看源代码
  2. b+行号/b+文件名:+行号/b+ 文件名:函数名:直接在第几行打断点或哪出位置打断点
  3. info b:查看断点
  4. d+断点编号:删除断点 注意:不能使用d+行号删除断点
  5. r/run:让程序运行起来
  6. c:让程序直接跑完
  7. quit:退出
  8. next/n:逐过程,相当于vs中的F10
  9. step/s:逐语句,相当于vs中的F11,gdb会记录最新的一条指令,如果想一次性重复多次s,只需在一个s后回车即可
    属性:gdb不退出,断点变化一次递增。断点可以被使能

以上是一些常用命令,我将gdb的命令整理成表格,如下所示:

命令/缩写作用样例
list/l显示源代码,从上次位置开始,每次列出10行list/l 10
list/l 函数名列出指定函数的源代码list/l main
list/l 文件名:行号列出指定文件的源代码list/l mycmd.c:1
r/run从程序开始连续执行run
n/next单步执行,不进入函数内部next
s/step单步执行,进入函数内部step
break/b [文件名:]行号在指定行号设置断点break 10
break test.c:10
break/b 函数名在函数开头设置断点break main
info break/b查看当前所有断点的信息info break
finish执行到当前函数返回,然后停止finish
print/p 表达式打印表达式的值print start+end
p 变量打印指定变量的值p x
set var 变量=值修改变量的值set var i=10
continue/c从当前位置开始连续执行程序continue
delete/d breakpoints删除所有断点delete breakpoints
delete/d breakpoints n删除序号为n的断点delete breakpoints 1
disable breakpoints禁用所有断点disable breakpoints
enable breakpoints启用所有断点enable breakpoints
info/i breakpoints查看当前设置的断点列表info breakpoints
display 变量名跟踪显示指定变量的值(每次停止时)display x
undisplay 编号取消对指定编号变量的跟踪显示undisplay 1
until X行号执行到指定行号until 20
backtrace/bt查看当前执行栈的各级函数调用及参数backtrace
info/i locals查看当前栈帧的局部变量值info locals
quit退出GDB调试器quit

2.4 调试 & 断点

调试的本质是什么?

  1. 找到问题
  2. 查看代码上下文
  3. 解决问题

断点的本质:把代码进行块级别划分,以块为单位,快速定位出现问题的区域

3.常见技巧

3.1 watch

如果我们想要监视某个变量,并且我们十分关心这个变量的变化,我们就可以用watch,它可以新老对比,我们就直接可以看到它的变化了。

  1. 比如我们想查看result
    在这里插入图片描述
  2. info b的时候我们会发现多了一个watchpoint
    在这里插入图片描述
  3. 我们继续正常调试,就会发现多了新老对比
    在这里插入图片描述
  4. 不用了的话我们可以直接d+断点序号进行删除

📌注意:

  • 果你有一些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变化了,就会通知你.

3.2 set var确定问题原因

set var也是我们比较常用的调试技巧,它可以确定并直接更改我们代码中的错误,而不需要去源代码中去改,。

  1. 例如在这段代码中错误是flag=0导致的,修正方案是将flag改为1
    在这里插入图片描述

3.3 条件断点

  1. 如果我们既不想一个断点被删掉又不想一个断点被使能掉,让它在某种条件下触发。比如我们想让i=10时触发断点。b + 行号+条件
    在这里插入图片描述
  2. 如果不需要了也可以直接d+断点序号
  3. 如果我们想要已经存在的断点加上触发条件,我们可以condition+断点序号+条件
    在这里插入图片描述
    给已经存在的3号断点加上触发条件

👍 如果对你有帮助,欢迎:

  • 点赞 ⭐️
  • 收藏 📌
  • 关注 🔔

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/983915.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ThinkPhp 5 安装阿里云内容安全(绿化)

composer require alibabacloud/green-20220302 首先要把php5(不支持php7)的执行文件设置到PATH环境变量 此外还要先执行composer update php5.5和php5.6的区别 5.5认为 <? 开头的也是php文件&#xff0c;包括 <?php 5.6认为 <? 开头的不是php文件&#xff0c;只…

Level DB --- 写流程计算

写流程架构Level DB --- 写流程架构-CSDN博客已经介绍&#xff0c;写流程计算包括写日志&#xff0c;和将kv插入到memtable中。 写日志和写memtable 用户端插入的kv数据&#xff0c;既要写日志同时也要写memtable。写日志是指kv记录要同步到日志文件中&#xff1b;写memtable…

JavaWeb-servlet6中过滤器和监听器

Servlet 过滤器 Servlet 过滤器&#xff08;Filter&#xff09;与 Servlet 十分相似&#xff0c;但 Filter 具有拦截客户端请求的功能&#xff0c; Filter 可以改变请求中的内容&#xff0c;以便满足实际开发中的需要。对于程序开发人员而言&#xff0c; Filter 实质上就是 We…

SQL PLUS与Oracle数据库的交互

一、SQL Plus与数据库的交互 可以 使用2种基本类型的命令与数据库进行交互&#xff1a; 服务器执行的命令&#xff1a;SQLQ命令&#xff08;以&#xff1b;结束&#xff09;和PL/SQL程序块&#xff08;以/结束&#xff09; 本地命令&#xff1a;SQL Plus命令 二、设置SQL Pl…

Git系列之git tag和ReleaseMilestone

以下是关于 Git Tag、Release 和 Milestone 的深度融合内容&#xff0c;并补充了关于 Git Tag 的所有命令、详细解释和指令实例&#xff0c;条理清晰&#xff0c;结合实际使用场景和案例。 1. Git Tag 1.1 定义 • Tag 是 Git 中用于标记特定提交&#xff08;commit&#xf…

WinForm模态与非模态窗体

1、模态窗体 1&#xff09;定义&#xff1a; 模态窗体是指当窗体显示时&#xff0c;用户必须先关闭该窗体&#xff0c;才能继续与应用程序的其他部分进行交互。 2&#xff09;特点&#xff1a; 窗体以模态方式显示时&#xff0c;会阻塞主窗体的操作。用户必须处理完模态窗体上…

关闭Windows安全中心,解析与实操指南

在这个数字化时代&#xff0c;Windows操作系统作为我们日常工作和娱乐的基石&#xff0c;其内置的Windows安全中心&#xff08;Windows Defender Security Center&#xff09;在保护系统安全方面扮演着重要角色。然而&#xff0c;对于某些高级用户或特定需求场景&#xff0c;关…

【 <一> 炼丹初探:JavaWeb 的起源与基础】之 JSP 标签库:自定义标签的开发与应用

<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、JSP 标签…

IDEA与Maven使用-学习记录(持续补充...)

1. 下载与安装 以ideaIU-2021.3.1为例&#xff0c;安装步骤&#xff1a; 以管理员身份启动ideaIU-2021.3.1修改安装路径为&#xff1a;D:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1勾选【创建桌面快捷方式】&#xff08;可选&#xff09;、【打开文件夹作为项目】&…

JS中的闭包(closures)一种强大但易混淆的概念

JavaScript 中的闭包&#xff08;closures&#xff09;被认为是一种既强大又易混淆的概念。闭包允许函数访问其外部作用域的变量&#xff0c;即使外部函数已执行完毕&#xff0c;这在状态维护和回调函数中非常有用。但其复杂性可能导致开发者的误解&#xff0c;尤其在变量捕获和…

根据指定 Excel 模板将 Excel 明细数据生成新的 Excel 文档

在日常工作中&#xff0c;我们常常需要生成 Excel 文档&#xff0c;例如将 Excel 数据 自动转换为独立的 Excel 文件。在这种需求下&#xff0c;如何高效地将 Excel 表格 中的每一条数据生成一个对应的 Excel 文档&#xff0c;并且让文档中的内容根据 Excel 数据动态变化&#…

前端杂的学习笔记

什么是nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 Nginx是一款轻量级的Web 服务器/反向代理服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;并且支持热部署&#xff0c;启动简单&#xff0c;可以做到7*24不间断运行 正代和反代 学习nginx&a…

C#控制台应用程序学习——3.8

一、语言概述 1、平台相关性 C# 主要运行在.NET 平台上。.NET 提供了一个庞大的类库&#xff0c;C# 程序可以方便地调用这些类库来实现各种功能&#xff0c;如文件操作、数据库访问、网络通信等。 2、语法风格 C# 的语法与 C、C 和 Java 有一定的相似性。例如&#xff0c;它使用…

【数据结构与算法】Java描述:第三节:栈与队列

一、 栈(Stack) 1.1 概念 栈&#xff1a; 一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。 进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守先进后出的原则。 压栈&#xff1a;栈的插入操作叫做进栈/压栈/…

MATLAB中movmax函数用法

目录 语法 说明 示例 向量的中心移动最大值 向量的尾部移动最大值 矩阵的移动最大值 包括缺失值的移动最大值 基于样本点计算移动最大值 仅返回满窗最大值 movmax函数的功能是求得移动最大值。 语法 M movmax(A,k) M movmax(A,[kb kf]) M movmax(___,dim) M mov…

linux学习(五)(服务器审查,正常运行时间负载,身份验证日志,正在运行的服务,评估可用内存)

服务器审查 在 Linux 中审查服务器的过程包括评估服务器的性能、安全性和配置&#xff0c;以确定需要改进的领域或任何潜在问题。审查的范围可以包括检查安全增强功能、检查日志文件、审查用户帐户、分析服务器的网络配置以及检查其软件版本。 Linux 以其稳定性和安全性而闻名…

Java中的栈的实现

Java中的栈的实现--双端队列&#xff08;Deque&#xff09; 1. 解释代码2.为什么不用 Stack<Character>&#xff1f;3.使用示例4.Deque 的常用方法5.LinkedList<> 和 ArrayDeque<> 的区别和联系6. 总结 1. 解释代码 Deque<Character> st new ArrayDe…

【Andrej Karpathy 神经网络从Zero到Hero】--2.语言模型的两种实现方式 (Bigram 和 神经网络)

目录 统计 Bigram 语言模型质量评价方法 神经网络语言模型 【系列笔记】 【Andrej Karpathy 神经网络从Zero到Hero】–1. 自动微分autograd实践要点 本文主要参考 大神Andrej Karpathy 大模型讲座 | 构建makemore 系列之一&#xff1a;讲解语言建模的明确入门&#xff0c;演示…

Go_zero学习笔记

<!-- go-zero --> 安装配置 go-zero_github go-zero文档 go install github.com/zeromicro/go-zero/tools/goctllatest goctl --version // goctl version 1.7.2 windows/amd64 gopath/bin/会生成goctl的执行进程(%GOPATH%\bin设置到path环境变量中) 安装protoc&pr…

nats jetstream server code 分析

对象和缩写 jetstream导入两个对象&#xff1a;stream and consumer&#xff0c;在stream 之上构造jetstreamapi。在nats代码中&#xff0c;以下是一些常见的缩写 1.mset is stream 2.jsX is something of jetstream 3.o is consumer 代码分析 对于producer &#xff0c;发送…