Linux笔记---调试工具GDB(gdb)

1. gdb的概念

GDB,全称GNU Debugger,是一个功能强大的开源调试工具,广泛用于Unix和类Unix系统,以及Microsoft Windows和macOS平台。GDB允许开发者在程序执行过程中查看内部运行情况,帮助定位和修复程序中的错误。

gdb的主要功能:

  1. 启动和控制程序执行:gdb可以按照自定义要求运行程序,并在指定的断点处暂停执行。
  2. 检查程序状态:当程序暂停时,gdb允许开发者检查程序中发生的事情,包括变量的值、函数的调用堆栈等。
  3. 修改变量和程序执行流程:gdb允许开发者在调试过程中修改变量的值,甚至改变程序的执行路径,以测试不同的情景。

2. gdb的使用

我们知道,一个程序的代码可以编译出两个版本:release和debug。

在Linux中,我们使用gcc/g++来编译代码Linux笔记---gcc/g++与编译链接-CSDN博客。

当我们使用这两个工具来编译代码时,默认情况下编译出的是release版本,这个版本是无法被调试的。如果想使用gdb来调试我们的代码,需要在编译时带上 [-g] 选项,保留调试信息,生成debug版本的可执行程序。

在命令行输入下面的指令即可开始对可执行程序进行调试:

gdb [可执行程序名] # 注意是对可执行程序进行调试,而不是源代码

在接下来的介绍中,我们以下面这段代码为例:

#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;
}

2.1 cgdb

在Linux中,直接使用gdb来调试程序并不方便,无法做到像在vs中一样对代码进行实时的可视化调试,对程序运行的跟踪十分麻烦:

可以看到,在启动gdb对test程序进行调试时,页面中不会有任何的调试信息,要查看代码都只能通过 [l] 命令来一段一段地查看,就更别说指示当前代码执行到哪一行的箭头了。

所以,我们推荐使用基于gdb的调试工具cgdb来进行调试:

cgdb是一个基于文本的调试工具,它是gdb调试器的一个前端界面,旨在提供一个更加用户友好的调试环境。cgdb结合了gdb的强大调试功能和文本界面的简洁性,使得开发者可以在命令行环境中更高效地进行程序调试。

cgdb的使用方式,各种命令与gdb完全一致,但cgdb相比于gdb还具有以下特点和功能:

  1. 用户友好的界面:cgdb提供了一个分屏界面,上半部分显示源代码,下半部分显示gdb命令行界面,使得开发者可以同时查看代码和执行调试命令。
  2. 语法高亮:cgdb支持源代码的语法高亮,使得代码更易于阅读和理解。
  3. 自动完成:cgdb具有自动完成功能,可以帮助开发者更快地输入gdb命令。
  4. 历史命令记录:cgdb记录了之前执行过的命令,开发者可以方便地调用和重复执行这些命令。
  5. 断点管理:cgdb提供了直观的断点管理界面,使得开发者可以轻松地设置、删除和查看断点。
  6. 变量查看:cgdb允许开发者查看和修改变量的值,以及查看函数的调用堆栈。

cgdb的安装方式在不同的平台有所不同,在Ubuntu中可使用下面的命令来安装:

sudo apt-get install cgdb

使用cgdb再次尝试调试程序:

 可以看到,代码动态地展现在屏幕上半,绿色的箭头动态地对代码的执行进行跟踪,极大地方便了我们对代码进行调试。

接下来我们再详细介绍gdb中的各种指令,例如上图中在15行打上断点并让程序运行了起来。

2.2 控制执行的相关指令

命令作用示例
[run] / [r]从头开始连续执行程序,直到遇到断点或程序结束

[next] / [n]逐过程调试,等价于vs中的F10
[step] / [s]逐步调试,等价于vs中的F11
[finish]执行完当前函数
[set var] + [变量名]=[值]修改某变量的值set var i=10 --- 将i的值修改为10
[continue] / [c]从当前位置开始连续执行程序,直到遇到断点或程序结束
[until] + [行号n]执行到指定行until 20 --- 执行到第20行
[until] + [文件名]:[行号n]执行到指定文件的指定行until test.c:16 --- 执行到test.c的第16行
[quit] / [q]退出gdb/cgdb

2.3 查看信息的相关指令

命令作用示例
[list] / [l] + [行号n]显示第n行前后的源代码,每次显示10行l 25 --- 显示25行前后的源代码
[list] / [l] + [函数名]显示指定函数的源代码list main --- 显示main函数的源代码
[list] / [l] + [文件名]:[行号n]显示指定文件的第n行前后的源代码,每次显示10行,这里的文件指编译形成该可执行程序的源代码文件l test.c:15 --- 显示test.c第15行前后的源代码
[info] / [i] + [breakpoints] / [break] / [b]查看断点信息列表
[display] + [表达式]跟踪显示表达式的值(每次停止时显示一次)display a+b --- 每次停止时显示a+b的值
[undisplay] + [表达式序号]取消对指定序号表达式的跟踪显示undisplay 1 --- 取消对1号表达式的追踪显示
[backtrace] / [bt]查看当前执行栈的各级函数调用及参数
[info] / [i] + [locals]查看当前栈帧的局部变量
[print] / [p] + [表达式]打印指定表达式的值p a+b --- 打印a+b的值

2.4 断点的相关指令

命令作用示例
[break] / [b] + [行号n]在第n行打断点b 13 --- 在13行打断点
[break] / [b] + [函数名]在指定函数的第一行打断点b main --- 在main函数第一行打断点
[break] / [b] + [文件名]:[行号n]在指定文件的第n行打断点b test.c:17 --- 在test.c的第17行打断点
[delete] / [d] + [断点序号]删除指定序号的断点,不指定时默认删除全部断点d 1 --- 删除序号为1的断点
[delete] / [d] + [breakpoints]删除全部断点d breakpoints --- 删除全部断点
[disable] + [断点序号]禁用指定序号的断点,不指定时默认禁用全部断点disable 2 --- 禁用序号为2的断点
[enable] + [断点序号]启用指定序号的断点,不指定时默认启用全部断点enable 2 --- 启用序号为2的断点
[watch] + [表达式]监视某表达式,当表达式值发生变化时程序停止并显示变化前后的值(监视也是一种断点,删除方式与断点相同)watch a+b --- 监视a+b的值
 条件断点

顾名思义,条件断点就是在满足一定条件时断点才生效,断点信息列表中有相应的信息。

命令作用示例
[break] / [b] + [行号n] + [条件]在第n行打条件断点b 13 if result == 64 --- 在第13行打上条件断点,改断点只有在result == 64时才生效
[break] / [b] + [函数名] + [条件]在指定函数的第一行打条件断点
[break] / [b] + [文件名]:[行号n] + [条件]在指定文件的第n行打条件断点
[condition] + [断点序号] + [条件]给普通断点加上条件condition 2 result == 54 --- 给2号断点设置条件result == 54,使之成为条件断点

注意:在删除指定断点或取消跟踪时要使用序号,而不能使用行号或表达式。断点的行号可以使用 [info] + [b] 查看,表达式的序号会在显示其值时一并显示出来。 

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

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

相关文章

编译器gcc/g++

gcc 只用来编译C g 编译C/C 1.预处理&#xff08;进行宏替换/去注释/条件编译/头文件展开等&#xff09; 先创建 code.c 文件 -E --> 从现在开始&#xff0c;进行程序的翻译&#xff0c;一旦预处理做完&#xff0c;就停下来 -o --> 表明 -o 后面的文件名称 code…

一.安装版本为19c的Oracle数据库管理系统(Oracle系列)

1.数据库版本信息&#xff1a; 版本信息&#xff1a; 或者直接由命令查出来&#xff1a; 2.操作系统的版本信息 3.安装包下载与上传 可以去oracle官网下载也可以从其他人的百度网盘链接中下载&#xff1a; 使用xftp工具或者其他的工具&#xff08;mobaxterm&#xff09;上传到l…

DimensionX 部署笔记

目录 生成视频用CogVideoX-5b-I2V 推理代码&#xff1a; DimensionX 生成视频用CogVideoX-5b-I2V 推理代码&#xff1a; 可以生成&#xff0c;从左向右旋转的&#xff0c;也可以生成从上往下旋转的&#xff1a; import torch from diffusers import CogVideoXImageToVideo…

uni-app移动端与PC端兼容预览PDF文件

过程遇到的问题 1、如果用的是最新的版本的pdfjs的话&#xff0c;就会报Promise.withResolvers 不是一个方法的错误&#xff0c;原因是Promise.withResolvers是ES15新特性&#xff0c;想了解可参考链接&#xff0c;这里的解决方案是将插件里的涉及到Promise.withResolvers的地…

Node.js | Yarn下载安装与环境配置

一、安装Node.js Yarn 是 Node.js 下的包管理工具&#xff0c;因此想要使用 Yarn 就必须先下载 Node.js。 推荐参考&#xff1a;Node.js | npm下载安装及环境配置教程 二、Yarn安装 打开cmd&#xff0c;输入以下命令&#xff1a; npm install -g yarn检查是否安装成功&…

开源TTS语音克隆神器GPT-SoVITS_V2版本地整合包部署与远程使用生成音频

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 本文主要介绍如何在Windows系统电脑使用整合包一键部署开源TTS语音克隆神器GPT-SoVITS&#xff0c;并结合cpolar内网穿透工…

[Docker#11] 容器编排 | .yml | up | 实验: 部署WordPress

目录 1. 什么是 Docker Compose 生活案例 2. 为什么要使用 Docker Compose Docker Compose 的安装 Docker Compose 的功能 使用步骤 核心功能 Docker Compose 使用场景 Docker Compose 文件&#xff08;docker-compose.yml&#xff09; 模仿示例 文件基本结构及常见…

鸿蒙NEXT应用示例:切换图片动画

【引言】 在鸿蒙NEXT应用开发中&#xff0c;实现图片切换动画是一项常见的需求。本文将介绍如何使用鸿蒙应用框架中的组件和动画功能&#xff0c;实现不同类型的图片切换动画效果。 【环境准备】 电脑系统&#xff1a;windows 10 开发工具&#xff1a;DevEco Studio NEXT B…

【spring 】Spring Cloud Gateway 的Filter学习

介绍和使用场景 Spring Cloud Gateway 是一个基于 Spring Framework 5 和 Project Reactor 的 API 网关&#xff0c;它旨在为微服务架构提供一种简单而有效的方式来处理请求路由、过滤、限流等功能。在 Spring Cloud Gateway 中&#xff0c;Filter 扮演着非常重要的角色&#…

opencv(c++)图像的灰度转换

opencv(c)图像的灰度转换 quickopencv.h #pragma once #include <opencv2/opencv.hpp> using namespace cv; class QuickDemo { public:void colorSpace_Demo(Mat& image); };quickopencv.cpp #include "quickopencv.h"// QuickDemo类中的颜色空间演示函…

problem forward和solution backward有什么区别

Note: 在具体研究中&#xff0c;problem forward是先提出问题&#xff0c;然后围绕着科学问题设计出完美的解决方案&#xff1b;而solution backward是先盘算自己有哪些技术&#xff0c;有哪些解决方案&#xff0c;反过来去寻找和定义问题。

C++构造函数详解

构造函数详解&#xff1a;C 中对象初始化与构造函数的使用 在 C 中&#xff0c;构造函数是一种特殊的成员函数&#xff0c;它在创建对象时自动调用&#xff0c;用来初始化对象的状态。构造函数帮助我们确保每个对象在被创建时就处于一个有效的状态&#xff0c;并且在不传递任何…

使用WebSocket技术实现Web应用中的实时数据更新

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用WebSocket技术实现Web应用中的实时数据更新 使用WebSocket技术实现Web应用中的实时数据更新 使用WebSocket技术实现Web应用中…

[N1CTF 2018]eating_cms

打开题目 只有个登录框&#xff0c;其他什么都没有&#xff0c;尝试了一下弱口令&#xff0c;没能成功 尝试访问一下register.php&#xff0c;看看能不能注册个账号 注册页面&#xff0c;随便注册个账号登陆一下 url中感觉是个注入点&#xff0c;尝试使用file伪协议读取一下us…

算法之二分查找优化:leetcode34:在排序数组中查找元素的第一个和最后一个位置

题干 分析 问题背景 给定一个已排序的数组&#xff0c;目标是找到一个给定的目标值 target 在数组中的 第一个位置 和 最后一个位置。如果目标值不存在&#xff0c;返回 [-1, -1]。 由于题干要求的时间复杂度是 O(log n)&#xff0c;并且数组是有序的&#xff0c;考虑使用二分…

【3D Slicer】的小白入门使用指南九

定量医学影像临床研究与实践 任务 定量成像教程 定量成像是从医学影像中提取定量测量的过程。 本教程基于两个定量成像的例子构建: - 形态学:缓慢生长肿瘤中的小体积变化 - 功能:鳞状细胞癌中的代谢活动 第1部分:使用变化跟踪模块测量脑膜瘤的小体积变化第2部分:使用PET标…

为什么要使用Ansible实现Linux管理自动化?

自动化和Linux系统管理 多年来&#xff0c;大多数系统管理和基础架构管理都依赖于通过图形或命令行用户界面执行的手动任务。系统管理员通常使用清单、其他文档或记忆的例程来执行标准任务。 这种方法容易出错。系统管理员很容易跳过某个步骤或在某个步骤上犯错误。验证这些步…

C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作&#xff0c;可以通过多种方式来实现。以下是一篇详细的指南&#xff0c;介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中&#xff0c;我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…

JavaWeb--MySQL

1. MySQL概述 首先来了解一下什么是数据库。 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。 像我们日常访问的电商网站京东&#xff0c;企业内部的管理系统OA、ERP、CRM这类的系统&#xff0c;以及大家每天都会刷的头条、抖音…

Qt学习笔记(四)多线程

系列文章目录 Qt开发笔记&#xff08;一&#xff09;Qt的基础知识及环境编译&#xff08;泰山派&#xff09; Qt学习笔记&#xff08;二&#xff09;Qt 信号与槽 Qt学习笔记&#xff08;三&#xff09;网络编程 Qt学习笔记&#xff08;四&#xff09;多线程 文章目录 系列文章…