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

news2024/11/18 13:57:54

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.coloradmin.cn/o/2242847.html

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

相关文章

如何在 Ubuntu 上安装 Mattermost 团队协作工具

简介 Mattermost 是一个开源、自托管的通信平台&#xff0c;专为团队协作设计。它类似于 Slack&#xff0c;提供聊天、消息传递和集成功能。Mattermost 在重视数据隐私的组织中特别受欢迎&#xff0c;因为它允许团队在自己的服务器上管理通信。以下是 Mattermost 的一些关键特…

2. Django中的URL调度器 (自定义路径转换器)

在 Django 中&#xff0c;URL 路由通常使用路径转换器&#xff08;path converters&#xff09;来匹配和捕获 URL 中的特定模式&#xff0c;例如整数、字符串或 slug 等。默认情况下&#xff0c;Django 提供了一些内置的路径转换器&#xff0c;如 <int>、<str>、&l…

【STM32】USB 简要驱动软件架构图

STM32 USB 软件架构比较复杂&#xff0c;建议去看 UM 1734 或者 st wiki STM32 USB call graph STM32 USB Device Library files organization Reference [1]: https://wiki.stmicroelectronics.cn/stm32mcu/wiki/Introduction_to_USB_with_STM32 [2]: UM1734

MATLAB 使用教程 —— 命令窗口输入命令,工作区显示变量

命令在命令窗口输入变量在工作区显示 MATLAB 桌面包含的面板如下&#xff1a; 当前文件夹 - 此面板允许访问项目文件夹和文件。命令窗口 - 这是主要区域&#xff0c;用户在命令行中输入命令&#xff0c;命令提示符(>>).工作区 - 工作区显示所有变量&#xff0c;无论是创…

华为USG5500防火墙配置NAT

实验要求&#xff1a; 1.按照拓扑图部署网络环境&#xff0c;使用USG5500防火墙&#xff0c;将防火墙接口加入相应的区域&#xff0c;添加区域访问规则使内网trust区域可以访问DMZ区域的web服务器和untrust区域的web服务器。 2.在防火墙上配置easy-ip&#xff0c;使trust区域…

时钟之CSS+JS版

写在前面 此版本绘制的时钟基于CSSJS模式。 优点操作简单&#xff0c;缺点当然是不够灵活。下一篇会基于HTML5的canvas标签&#xff0c;使用JS绘制。会更灵活&#xff0c;元素更加丰富。 HTML代码 <div class"box"><article class"clock"><…

blender 骨骼的动画基础 笔记总结

一、世界纹理 1.首先打开Node Wrangler&#xff08;世界纹理&#xff09;插件 在编辑的偏好设置这里&#xff0c; 演示一下这个插件&#xff1a; 然后通过shift a添加环境纹理 对其连接颜色后&#xff0c;选中世界纹理&#xff0c;通过按键ctrl t 二、动画 点击动画 1.…

java ssm 健康医馆管理系统 中医馆管理 健康平台 药店 源码jsp

一、项目简介 本项目是一套基于SSM的健康医馆管理系统&#xff0c;主要针对计算机相关专业的和需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本、软件工具等。 项目都经过严格调试&#xff0c;确保可以运行&#xff01; 二、技术实现 ​后端技术&#x…

前端无感刷新token

摘要&#xff1a; Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌&#xff08;access token&#xff09;的技术&#xff0c;确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项&#xff1a; 访问…

【AI图像生成网站Golang】雪花算法

AI图像生成网站 目录 一、项目介绍 二、雪花算法 三、JWT认证与令牌桶算法 四、项目架构 五、图床上传与图像生成API搭建 六、项目测试与调试(等待更新) 雪花算法 雪花算法 (Snowflake) 是一种高效、可扩展的分布式唯一ID生成算法&#xff0c;最早由 Twitter 开发&…

[369]基于springboot的高校教师教研信息填报系统

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统高校教师教研信息填报系统信息管理难度大&#xff0c;容错…

《素书》:为上计,事当缓;为下计,事当急

《素书》是中国古代一部重要的典籍&#xff0c;相传为秦末黄石公作&#xff0c;内容主要讲述为人处世的道理。其中&#xff0c;“为上计&#xff0c;事当缓&#xff1b;为下计&#xff0c;事当急”这句话&#xff0c;给人以深刻的启示。 首先&#xff0c;对于上策之事&#xf…

树莓派4B Qt+FFMPEG 多线程录制USB相机mjpeg数据流“h264_omx“硬件编码的MP4文件

文章目录 1 前言2 一些问题说明2.0 树莓派4b系统版本2.1 Qt2.2 FFMPEG2.3 图像格式 3 核心代码3.0 代码逻辑3.1 pro文件3.2 avframequeue.cpp3.3 decodethread.cpp 4 资源下载 1 前言 本项目为在树莓派4B开发板上&#xff0c;通过QtFFMPEG以多线程分别解码、编码USB摄像头视频数…

排序算法(基础)大全

一、排序算法的作用&#xff1a; 排序算法的主要作用是将一组数据按照特定的顺序进行排列&#xff0c;使得数据更加有序和有组织。 1. 查找效率&#xff1a;通过将数据进行排序&#xff0c;可以提高查找算法的效率。在有序的数据中&#xff0c;可以使用更加高效的查找算法&…

计算机网络:运输层 —— TCP 的拥塞控制

文章目录 TCP的拥塞控制拥塞控制的基本方法流量控制与拥塞控制的区别拥塞控制分类闭环拥塞控制算法 TCP的四种拥塞控制方法&#xff08;算法&#xff09;窗口慢开始门限慢开始算法拥塞避免算法快重传算法快恢复算法 TCP拥塞控制的流程TCP拥塞控制与网际层拥塞控制的关系 TCP的拥…

如何在Mysql中生成0-23完整的小时数据

目录 1. 创建表2. 插入0-23小时的数据3. 查询并合并数据 在数据分析中&#xff0c;我们经常需要对特定时间段内的数据进行统计和分析。 例如&#xff0c;在名片进线的场景中&#xff0c;我们可能需要了解一天内每小时的名片进线数量。 然而&#xff0c;由于某些时间点可能没有数…

【GeekBand】C++设计模式笔记12_Singleton_单件模式

1. “对象性能” 模式 面向对象很好地解决了 “抽象” 的问题&#xff0c; 但是必不可免地要付出一定的代价。对于通常情况来讲&#xff0c;面向对象的成本大都可以忽略不计。但是某些情况&#xff0c;面向对象所带来的成本必须谨慎处理。典型模式 SingletonFlyweight 2. Si…

架构篇(理解架构的模式2)

目录 一、管理和监控 大使模式&#xff1a;创建代表消费者服务或应用程序发送网络请求的帮助服务 反腐模式&#xff1a;在现代应用程序和遗留系统之间实现装饰或适配器层 外部配置存储&#xff1a;将应用程序部署包中的配置信息移动到中心化的位置 网关聚合模式&#xff1…

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况

20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况 2024/11/16 13:42 缘起&#xff1a;最近需要通过iperf3打流&#xff0c;因此在ubuntu20.04服务器上常开sudo nethogs监控流量。 但是发现一个异常&#xff0c;ubuntu20.04服务器上发送的流量过大…

DevOps工程技术价值流:打造卓越项目协作的优化宝典

一、引言 解锁项目协作的无限潜力&#xff0c;覆盖全链路实现流畅高效。 在当今瞬息万变的商业环境中&#xff0c;项目协作的效率和效果直接关系到企业的竞争力和市场响应速度。DevOps工程技术价值流中的项目协作优化&#xff0c;不仅是技术层面的革新&#xff0c;更是团队协…