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

Linux下调试器gdb/cgdb的使用

目录

1.gdb如何进入调试界面

2.gdb的一些指令

​编辑​编辑

3.调试技巧

1.watch

2.set var

条件断点

CGDB 介绍:Linux 下的强大调试工具

1. CGDB 的主要特点

2. 安装 CGDB

在 Ubuntu/Debian 上安装

在 CentOS/RHEL 上安装

在 macOS 上安装(使用 Homebrew)

3. 基本使用方法

启动 CGDB

CGDB 界面布局

4. 常用调试命令

基本调试命令(与 GDB 相同)

CGDB 特有操作

5. 示例调试过程

调试示例程序 test.c

编译并调试

调试步骤

6. 高级功能

7. 与 GDB 的区别

8. 总结


1.gdb如何进入调试界面

gdb是一款代码调试的工具,在vscode2022下,我们可以对我们的代码进行调试,发现问题所在,同样的,这么好用的功能在Linux下也不可避免被频繁使用。

首先我们调试的目的是要查找问题。

如果我们在Linux下写一个文件,直接gcc,然后用gdb打开它会无法调试。

这是因为我们的代码有2个版本一个是debug版本,一个是release版本,只有在debug版本下我们才可以进行调试,而gcc默认会将文件发布成release版本,这个时候我们就需要加上-g选项指定gcc将我们的文件编译为debug版本。这个时候我们就可以进入我们的调试界面了

2.gdb的一些指令

vs我们进行编译我们有一些快捷键,比如打断点,逐过程,逐语句,我们的Linux也有一些指令进行这些操作帮助我们进行问题的查找。

        首先b+行号是打断点,b 9就是给弟9行打断点。我们这里b 18给在第18行的代码打上断点,这个时候它的行标就会变色。

同时我们也支持查看我们设置了哪些断点

info b是查断点。

同时我们打断点,查断点,也要支持我们对断点进行删除。

这里我们查看断点时我们可以看到最左边有对断点的编号,我们需要d+断点编号对断点进行删除。

这里我们d 2就对我们第二个断点进行了删除。

同时我们也支持删除所有的断点,d breakpoints是删除所有的断点。

我们调试时如果想让代码跑起来就需要r指令。这个会让我们程序从开始连续执行直到断点处。

这里我们有几个细节需要注意:

细节1:gdb启动调试的时候,只是开启了gdb,被调试的程序并没有运行起来。

细节2:r/run,表示的是在gdb的场景下,启动我们自己的mmycmd程序。

细节3:在没有断点的情况下,r/run就是让我们的程序直接运行直到结束。

细节4:断点的本质功能:让我们的程序,在运行到指定的行,进行暂停

r相当于我们vs2022里的F5,进行程序运行。

我们也支持逐过程,n是逐过程,单步执行,不进入函数内部,相当于F10。

逐语句:s,单步执行,进入函数的内部,相当于F11.

vs下我们支持监视窗口对某个变量值的查看,我们Linux下必须也支持啊!

我们p+变量名就是查看该变量的值,但是这个p只能查看一次,我们vs下监视窗口的变量值是常显示的,我们想让某个变量常显示,就需要 display i进行常显示。

undisplay i 就是对某个值取消常显示,但是注意这个i是编号,而非变量名。

在VS下我们的F5是从一个断点跑到另一个断点,我们的Linux也必须支持这个功能啊!

我们Linux下按c就是从当前位置开始连续执行程序直到程序结束或者运行到下一个断点。

如果我们进入到一个函数但是我们后悔了该怎么办?vs下直接跳转到该行。

我们Linux就得使用finish来执行到当前函数返回然后停止

总而言之,我们使工具进行debug的本质是借助工具帮助我们找到问题所在。

而不是解决问题,解决问题是人或者AI去解决的。

我们在查找的时候也有一定的技巧,我们学过二分查找,这个算法效率比较高,所以我们在实际项目中也可以使用这个算法来进行问题的定位,以断点的方式进行,找到问题的思路,这种一般是在非常复杂的问题我们才搞这个,我们写个100行左右的代码没必要使用这样的方式。当然如果要用也是可以的。

下面继续介绍一些命令:

bt 查看函数调用的堆栈结构

info i查看当前debug的程序信息

info local 查看当前函数内的临时变量


我们的断点是可以被禁用的,是为了保留我们懂得调试痕迹,防止问题再次出现。

禁用断点是:

disable 编号

能禁用我们就要启用,这个时候是

enable 编号


3.调试技巧

1.watch

watch:执⾏时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运⾏期间的值发⽣变化,GDB会暂 停程序的执⾏,并通知使⽤者

2.set var

set var flag=1可以临时改变一下我们变量的值,这个指令就可以把我们的flag临时设定为1.
我们的flag值原来为0,现在我们把它临时设置为1,验证我们出现的错误是否是由于该变量的值错误而导致的。

 

条件断点

我们可以在调试的过程中打条件断点,顾名思义,当满足某个条件的时候我们的断点才生效。
b q if i==30 这个就表示在弟q行如果我们的i值等于30我们就停下来,断点生效。排查逻辑上的错误。
我们也可以给现有的断点添加条件,comdition 2 i==30 给编号为2的断点加上条件。

CGDB 介绍:Linux 下的强大调试工具

CGDB(Curses-based GNU Debugger) 是一个基于 GDB(GNU Debugger) 的增强版调试工具,它在终端环境下提供了类似 图形界面 的调试体验。CGDB 使用 ncurses 库实现了分屏界面,上方显示源代码,下方是 GDB 命令行,使得调试更加直观和高效。


1. CGDB 的主要特点

  • 分屏界面:上方显示源代码,下方是 GDB 命令行,方便查看代码和执行调试命令。

  • 语法高亮:支持代码高亮,提高可读性。

  • 快捷键操作:类似 Vim 的快捷键(支持 hjkl 移动),提高调试效率。

  • 完全兼容 GDB:所有 GDB 命令都可以在 CGDB 中使用。

  • 轻量级:纯终端运行,不需要 GUI 环境,适合远程 SSH 调试。


2. 安装 CGDB

在 Ubuntu/Debian 上安装

bash

sudo apt update
sudo apt install cgdb

在 CentOS/RHEL 上安装

bash

sudo yum install epel-release  # 如果未安装 EPEL 仓库
sudo yum install cgdb

在 macOS 上安装(使用 Homebrew)

bash

brew install cgdb

3. 基本使用方法

启动 CGDB

bash

cgdb <可执行程序>  # 直接调试程序
cgdb -p <PID>     # 附加到正在运行的进程

CGDB 界面布局

text

+----------------------------------+
| 源代码窗口(可浏览和设置断点)    |
|                                  |
|                                  |
|                                  |
+----------------------------------+
| GDB 命令窗口(输入调试命令)      |
+----------------------------------+
  • Esc:切换到源代码窗口(可浏览代码)

  • i:切换到 GDB 命令窗口(输入调试命令)


4. 常用调试命令

基本调试命令(与 GDB 相同)

命令说明
break <行号/函数名>设置断点
run启动程序
next (n)单步执行(不进入函数)
step (s)单步执行(进入函数)
continue (c)继续执行直到下一个断点
print <变量> (p)打印变量值
backtrace (bt)查看调用栈
quit (q)退出调试

CGDB 特有操作

快捷键说明
Esc进入源代码窗口
i进入 GDB 命令窗口
Space在源代码窗口设置/取消断点
/在源代码窗口搜索
o在 GDB 窗口切换布局(水平/垂直)

5. 示例调试过程

调试示例程序 test.c

c

#include <stdio.h>int main() {int a = 10;int b = 20;int sum = a + b;printf("Sum: %d\n", sum);return 0;
}

编译并调试

bash

gcc -g test.c -o test  # 编译时加上 -g 选项生成调试信息
cgdb ./test            # 启动 CGDB

调试步骤

  1. 在 main 函数处设置断点:

    • 按 Esc 进入源代码窗口,移动光标到 int a = 10; 行,按 Space 设置断点。

  2. 按 i 进入 GDB 命令窗口,输入 run 运行程序。

  3. 单步执行:

    • nnext)执行下一行,不进入函数。

    • sstep)进入函数(如 printf)。

  4. 查看变量:

    • p a 打印变量 a 的值。

  5. 继续执行:

    • ccontinue)直到程序结束。


6. 高级功能

  • 多窗口布局:支持水平/垂直分屏(o 切换)。

  • TUI 模式:类似 GDB 的 TUI 模式,但更友好。

  • 自定义配置

    • 配置文件 ~/.cgdb/cgdbrc 可以设置快捷键和主题。


7. 与 GDB 的区别

特性CGDBGDB
界面分屏(代码+GDB)纯命令行
快捷键Vim 风格需自定义
代码浏览直接查看需 list 命令
易用性更高较低

8. 总结

  • CGDB 适合

    • 喜欢终端调试但想要更直观界面的开发者。

    • 需要快速查看代码并设置断点的场景。

  • GDB 适合

    • 纯命令行环境,或需要脚本化调试时。

CGDB 结合了 GDB 的强大功能和 TUI 的便捷性,是 Linux 下 C/C++ 调试的高效工具!

http://www.xdnf.cn/news/15639.html

相关文章:

  • Unity 多人游戏框架学习系列一
  • 23.将整数转换为罗马数字
  • 全局 WAF 规则:构筑 Web 安全的坚固防线
  • 设计模式一: 模板方法模式 (Template Method Pattern)
  • 基于 AI 的大前端安全态势感知与应急响应体系建设
  • 检查WSL2子系统文件大小并删除
  • 《星盘接口10:时空回响》
  • OpenAI GPT-4o技术详解:全能多模态模型的架构革新与生态影响
  • 虚拟主机CPU占用100导致打不开的一次处理
  • 利用模型生成每个样本每个特征的 SHAP 值
  • 【Git 中的 branch 工作流】关于git 中 branch 的一些基本操作
  • 【每日算法】专题十_字符串
  • 小架构step系列15:白盒集成测试
  • Translational Psychiatry | 通过流形学习和网络分析揭示精神分裂症与双相I型障碍的差异性精神病症状
  • 音视频学习(三十九):IDR帧和I帧
  • 《黑马笔记》 --- C++核心编程
  • PHP安全漏洞深度解析:文件包含与SSRF攻击的攻防实战
  • 在新闻资讯 APP 中添加不同新闻分类页面,通过 ViewPager2 实现滑动切换
  • 网络基础协议综合实验
  • GeoTools 工厂设计模式
  • 【Linux庖丁解牛】— 保存信号!
  • SAP学习笔记 - 开发45 - RAP开发 Managed App New Service Definition,Metadata Extension
  • C++中list各种基本接口的模拟实现
  • 25、企业能源管理(Energy):锚定双碳目标,从分类管控到智能优化的数字化转型之路
  • npu-smi info命令参数解释
  • C++-linux系统编程 8.进程(三)孤儿进程、僵尸进程与进程回收
  • 数据结构之单链表
  • Java :List,LinkedList,ArrayList
  • sqli-labs靶场通关笔记:第17关 POST请求的密码重置
  • 连接new服务器注意事项