Linux -- 认识 gdb

目录

前言:

Debug 模式和 Release 模式

怎么安装 gdb?(CentOS7)

怎么使用 gdb?

进入 gdb 模式:

查看代码:

 执行代码:

断点:

打断点:

查看断点:

删除断点:

使能断点:

逐过程与逐语句调试: 

查看变量:

一次性显示:

常显示:

范围调试:

多分枝测试:

退出 gdb :

​编辑 


前言:

前面我们学习了怎么在Linux下编写代码和运行代码,下面将学习怎么调试代码。

Debug 模式和 Release 模式

可执行程序有两个模式,一个是 Debug 模式,一个是 Release 模式:

1、Debug 模式下的可执行程序添加了调试信息,可以被调试,且体积较大

2、Release 模式下的可执行程序去掉了调试信息,不可以被调试,且体积较小

gcc/g++编译后的可执行程序默认为 Release 模式,若需要生成的可执行程序为 Debug 模式,需要在编译时,加上 -g

怎么安装 gdb?(CentOS7)

root 用户下,输入命令 yum install -y gdb

或者在普通用户下,输入 sudo yum install -y gdb

怎么使用 gdb?

我们现在写了一段代码,文件名为 test.c ,下面将演示如何调试这段代码:

进入 gdb 模式:

先把代码编译后,得到可执行程序 test,gdb 可执行程序(Debug) 就可以开始调试代码,千万记住是Debug模式,Release模式不能调试代码

 

必须是可执行程序才可以调试,否则会报错,提示该文件不是可执行程序! 

 

查看代码:

l 命令可以查看代码,一次可以查看 10 行:

 

我们也可以指定行数查看代码, l 行数 即可:

l 1 表示从头开始查看代码,回车可以向后查看代码:

如果行数不是 1 ,而是其他数字,则会显示 行数 的上下 10 行代码!

 

也可以指定想查看的代码的开始行和结尾行,l 数字,数字:

 

 执行代码:

gdb 模式下可以运行代码,查看运行结果,输入命令 r

 

断点:

打断点:

命令 b 行数 可以给指定的代码打断点:

命令 b 函数 可以给指定的函数打断点:

命令  b  文件名:行数  可以给指定文件的某一行代码打断点,指定的文件是可执行程序的依赖文件:

 

查看断点:

命令 info b 可以查看断点信息:

删除断点:

命令 d 断点编号 可以删除断点,注意是断点编号,而不是断点所在的行数

使能断点:

如果我们不想让这个断点生效,又不想删除断点,我们可以禁用断点,disable 断点编号 可以禁用断点,当我们查看断点信息时,Enb 列可以查看断点是否被禁用了,y 表示启用断点,n 表示禁用断点

enable 断点编号 可以重新打开断点: 

 

逐过程与逐语句调试: 

1、逐过程表示调试时,若遇到函数,会执行完整个函数,不会进入函数内部调试,把函数当作一条语句;

2、逐语句表示代码一条一条的调试,若遇到函数,会进入函数内部一句一句调试代码。

在进行逐过程和逐语句调试时,要先把代码跑起来,代码遇到断点会停下来,在代码停下来的地方,我们可以选择逐过程还是逐语句调试代码,下面是具体演示:

假设我们在代码的第16行打上了断点,

命令 n 表示逐过程:

命令 s 表示逐语句:

如果我们在调试时想跳出 for 循环,可以用命令 until 行数,跳转到指定的代码,当然 until 不止可以跳出 for 循环,想跳转的情况都可以使用。 

 

查看变量:

当我们逐过程或者逐语句调试时,想查看某个变量的值或者变量的地址,gdb 中可以选择一次性查看或者常显示 。

一次性显示:

命令 p 变量名 可以查看当前执行下变量的值,不过只显示一次,继续调试时不再显示:

常显示:

display 变量名 可以在执行代码时常显示变量的值:

我们常显示变量的值时,每个变量前面都有编号,如果我们不想常显示某个变量,undisplay 变量对应的编号 就可以取消常显示

 

范围调试:

除了前面 until 可以跳转到指定的代码外,还有以下两个常见的命令可以进行范围调试:

命令 c 可以从当前断点运行到下一个断点:

命令 finish 可以执行完当前的函数。

如下所示,命令 bt 可以查看调用堆栈,当前执行的函数为Sum,命令 finish 就可以执行完 Sum 函数,回到调用该函数的那一行代码:

多分支测试:

 

在进入 if 判断时,命令 set  var  变量名=值 可以在不修改代码的情况下,修改变量的值, 实现其他分支的测试:

 

注意修改变量的值的时机,在进入 if 判断之前修改变量的值的话,没办法如预期设想的走向另一个分支: 

 

退出 gdb :

输入命令 quit 就可以退出:

 

本文内容结束,欢迎各位大佬的批评指正! 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端埋点数据收集和数据上报

原文地址 什么是埋点 学名叫时间追踪(Event Tracking), 主要针对用户行为或者业务过程进行捕获,处理和发送相关技术及实施过程. 埋点是数据领域的一个专业术语,也是互联网领域的俗称,是互联网领域的俗称 埋点是产品数据分析的基础&#xf…

深度解读李彦宏的“不要卷模型,要卷应用”

深度解读李彦宏的“不要卷模型,要卷应用” —— AI技术的应用之道 引言 在2024世界人工智能大会的舞台上,李彦宏的“不要卷模型,要卷应用”言论犹如一石激起千层浪,引发了业界对AI技术发展路径的深思。本文将深入探讨这一观点&a…

Eagle 4.0 更新了哪些功能,值得购买吗?

这个全新的版本带来了一系列重磅级别的更新,包括全新的「插件系统」、「全新的 UI 风格」以及「AI 工具」等。所有这些,都是为了提供给用户更加优质的使用体验,让工作的流程更加流畅,更加高效。 我们的团队始终倾听用户的声音&am…

C语言:指针详解(5)

目录 一、sizeof()函数和strlen()函数的对比 二、数组和指针笔试题解析 三、指针运算笔试题解析 正文开始 一、sizeof()函数和strlen()函数的对比 1.sizeof()函数 在学习操作符的时候,我们了解了sizeof()函数。sizeof()函数是用来计算变量所占内存空间大小的&a…

Python自定义可切片的类

Python自定义可切片的类 在Python中,要创建一个自定义可切片的对象,你需要实现 __getitem__ 方法。这个方法允许对象支持索引操作,包括切片。 下面是一个简单的例子,展示了如何创建一个支持切片操作的自定义类: class MyList:def __init__(self, data):self.data = dat…

开源 Wiki 系统 InfoSphere 2024.01.1 发布

推荐一套基于 SpringBoot 开发的简单、易用的开源权限管理平台,建议下载使用: https://github.com/devlive-community/authx 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件:https://github.com/devlive-commun…

Java高风险之在用户界面(UI)中显示敏感数据(Display of sensitive data in the user interface)

风险介绍 Display of sensitive data in the user interface,在用户界面(UI)中显示敏感数据可能带来多种风险,这可能导致信息泄露和不必要的风险,因为敏感数据可能会被截屏、监控软件捕获、或者被旁观者看到。这些风险涉及数据泄露、身份盗用、经济损失和法律处罚等。 数…

算法笔记——LCR

一.LCR 152. 验证二叉搜索树的后序遍历序列 题目描述: 给你一个二叉搜索树的后续遍历序列,让你判断该序列是否合法。 解题思路: 根据二叉搜索树的特性,二叉树搜索的每一个结点,大于左子树,小于右子树。…

男女相貌之秘 -高直上人

描述 高直上人,一个富有才华的老师! 对于大家的学习有不可多得的帮助。 内容 目前主要的内容以面相为主,对于学习面相有比较大的帮助! 但是网络上面错综复杂,很多老旧的版本影响学习! 而这里我整理了相…

软考高级第四版备考--第18天(规划风险管理)Plan Risk Management

定义:定义如何实施项目风险管理活动的过程 作用:确保风险管理的水平、方法和可见度与项目风险程度相匹配,与对组织和其他干系人的重要程度相匹配。 输入:1、项目管理计划(在规划项目风险管理时,应考虑所有…

“存算分离“和“湖仓一体“

"存算分离"和"湖仓一体"是在大数据领域中常见的两种数据架构设计理念,用于处理和管理大数据的存储和分析需求。 1. 存算分离(StorageCompute Separation): 定义:存算分离是一种架构设计思想&#…

Python3.6.6 OpenCV 将视频中人物标记或者打马赛克或加图片并保存为不同格式

1、轻松识别视频人物并做出标记 需安装face_recongnition与dlib,过程有点困难,还请网上查找方法 import face_recognition import cv2 #镜像源 -i https://pypi.mirrors.ustc.edu.cn/simple # 加载视频 video_file E:\\videos\\1.mp4 video_capture …

Qt下使用OpenCV的鼠标回调函数进行圆形/矩形/多边形的绘制

文章目录 前言一、设置imshow显示窗口二、绘制圆形三、绘制矩形四、绘制多边形五、示例完整代码总结 前言 本文主要讲述了在Qt下使用OpenCV的鼠标回调在OpenCV的namedWindow和imshow函数显示出来的界面上进行一些图形的绘制,并最终将绘制好的图形显示在QLabel上。示…

UE4 解决创建布料报错:三角形退化

**【问题】**创建创建布料时报错:三角形退化 【方法】 1.要重新绑定:导入到ue4为静态网格体,勾选“移除退化”,再导出fbx,再重新绑定 2.不用重新绑定:使用排除法(费时)&#xff0c…

全栈物联网项目:结合 C/C++、Python、Node.js 和 React 开发智能温控系统(附代码示例)

1. 项目概述 本文详细介绍了一个基于STM32微控制器和AWS IoT云平台的智能温控器项目。该项目旨在实现远程温度监控和控制,具有以下主要特点: 使用STM32F103微控制器作为主控芯片,负责数据采集、处理和控制逻辑采用DHT22数字温湿度传感器,精确采集环境温湿度数据通过ESP8266 W…

js播放mp3,并且读取srt字幕文件,展示字幕

下面是gpt生成的代码&#xff0c;能跑&#xff0c;但是性能gpt是不考虑的&#xff0c;自行斟酌 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>MP3播放器</title> </head> <body><h1>MP3播放器…

Mac和VirtualBox Ubuntu共享文件夹

1、VirtualBox中点击设置->共享文件夹 2、设置共享文件夹路径和名称&#xff08;重点来了&#xff1a;共享文件夹名称&#xff09; 3、保存设置后重启虚拟机&#xff0c;执行下面的命令 sudo mkdir /mnt/share sudo mount -t vboxsf share /mnt/share/ 注&#xff1a;shar…

Leetcode-203-移除链表元素-临时变量作用域-c++

题目详见https://leetcode.cn/problems/remove-linked-list-elements/ 题解代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullpt…

你需要知道的笔记本养护的几个小知识

笔记本充电器可以长期不拔吗&#xff1f; 可以&#xff0c;但建议偶尔使用电池激发电池活性并且修正电量计精度&#xff1b; 当充电器接入后&#xff0c;笔记本会优先使用充电器进行供电而不会使用电池供电&#xff0c;同时充电器也会为缺电的电池补充电量。 现在笔记本电脑普遍…

大数据开发中的数据驱动决策:关键问题与实践指南

目录 决策前的准备工作1. 我已经掌握了哪些信息&#xff1f;2. 我们已经做出决定了吗&#xff1f;3. 我们需要哪些额外信息以及何时需要&#xff1f; 决策过程中的关键问题1. 我们需要做这个决定吗&#xff1f;2. 错误地做出这个决定的代价是什么&#xff1f; 决策后的反思1. 我…