[GDB] cgdb: GDB 可视化工具

news/2025/11/3 22:54:17/文章来源:https://www.cnblogs.com/migrator/p/19188498
[GDB] cgdb: GDB 可视化工具

Grok生成(2025年11月3日22:52:04)

目录
  • GDB 与 CGDB 学习文档
    • 前言:为什么要学习 GDB 和 CGDB?
    • 目录
    • 1. 环境准备
      • 安装工具
      • 验证安装
    • 2. 编译时必须加 -g!(最容易忽略的点)
    • 3. GDB 基础命令(背会这 15 个就够用 80%)
    • 4. CGDB 安装与界面详解
      • 启动 CGDB
      • CGDB 界面划分(分屏)
      • 关键快捷键(比 GDB 好用 10 倍!)
    • 5. CGDB 实战演练(带示例代码)
      • 示例代码:bug.c
      • 编译
      • 启动 CGDB
      • 操作步骤(跟着做!)
    • 6. 常见调试场景
      • 场景1:程序崩溃(Segmentation fault)
      • 场景2:循环没停(死循环)
      • 场景3:条件断点(只在 i==3 时停)
    • 7. 高级技巧(进阶必备)
    • 8. 练习题(动手做!)
      • 练习1:数组越界
      • 练习2:死循环
      • 练习3:条件断点
    • 9. 资源推荐
    • 总结:你的调试流程(贴在桌边!)

GDB 与 CGDB 学习文档

—— 专为初学者设计,中文详细讲解,易懂易上手


前言:为什么要学习 GDB 和 CGDB?

调试(Debugging)是程序员的“侦探工作”。
当程序崩溃、结果不对、卡死时,GDB(GNU Debugger)是 Linux 下最强大的“放大镜”,能让你:

  • 看到程序每一步在做什么
  • 查看变量值
  • 找到崩溃位置
  • 控制程序暂停、继续、单步执行

CGDB 是 GDB 的“可视化皮肤”,像 IDE 一样有:

  • 代码高亮
  • 分屏显示源码
  • 键盘操作更友好

本教程目标:让你 3 天内从“完全不会”到“能用 GDB/CGDB 调试简单 C/C++ 程序”。


目录

  1. 环境准备
  2. GDB 基础命令(核心!)
  3. 编译时加调试信息(必须!)
  4. CGDB 安装与界面详解
  5. CGDB 实战操作(带图解)
  6. 常见调试场景(崩溃、断点、条件断点)
  7. 高级技巧(watch、backtrace、frame)
  8. 练习题(必做!)
  9. 资源推荐

1. 环境准备

安装工具

# Ubuntu/Debian
sudo apt update
sudo apt install gdb cgdb build-essential# CentOS/RHEL
sudo yum install gdb cgdb gcc gcc-c++# Arch Linux
sudo pacman -S gdb cgdb gcc

验证安装

gdb --version      # 应该显示版本号
cgdb --version

2. 编译时必须加 -g!(最容易忽略的点)

# 错误示范(没有调试信息)
gcc main.c -o app# 正确示范(加上 -g)
gcc -g main.c -o app        # 调试用
gcc -g -O0 main.c -o app    # 推荐:关闭优化,更好调试

记住:不加 -g,GDB 看不到源码和变量!


3. GDB 基础命令(背会这 15 个就够用 80%)

命令 含义 示例
gdb ./app 启动 GDB 调试程序 gdb ./app
rrun 运行程序 r
r arg1 arg2 带参数运行 r 10 20
b 行号 在某行设置断点 b 15
b 函数名 在函数入口断点 b main
ccontinue 继续运行到下一个断点 c
nnext 单步执行(不进入函数) n
sstep 单步执行(进入函数) s
p 变量print 打印变量值 p i
p 数组[0]@5 打印数组前5个元素 p arr[0]@5
btbacktrace 查看调用栈 bt
f 编号frame 切换到某层栈帧 f 2
llist 显示当前源码 l
info breakpoints 查看所有断点 info b
d 断点号delete 删除断点 d 1
qquit 退出 GDB q

4. CGDB 安装与界面详解

启动 CGDB

cgdb ./app

CGDB 界面划分(分屏)

┌─────────────────────────────────────────────┐
│ [CGDB 标题栏]                               │
├─────────────┬───────────────────────────────┤
│             │                               │
│  源码窗口   │     GDB 命令窗口              │
│ (高亮显示)  │  > (gdb)                      │
│             │                               │
└─────────────┴───────────────────────────────┘

关键快捷键(比 GDB 好用 10 倍!)

按键 功能
Esc 切换到 源码窗口(可上下翻代码)
i 切换到 GDB 命令窗口(输入命令)
Ctrl + L 刷新屏幕
F5 相当于 run
F6 相当于 continue
F7 相当于 step(进入函数)
F8 相当于 next(不进入)
PageUp / PageDown 翻页看源码
o 在源码窗口跳到当前执行行
Ctrl + T 显示 TUI 模式(类似 gdb 的 layout

5. CGDB 实战演练(带示例代码)

示例代码:bug.c

#include <stdio.h>int add(int a, int b) {int c = a + b;return c;
}int main() {int i;int arr[5] = {1, 2, 3, 4, 5};for(i = 0; i <= 5; i++) {  // 故意越界!printf("arr[%d] = %d\n", i, arr[i]);}int sum = add(10, 20);printf("sum = %d\n", sum);return 0;
}

编译

gcc -g -O0 bug.c -o bug

启动 CGDB

cgdb ./bug

操作步骤(跟着做!)

  1. 启动后按 i 进入 GDB 窗口
  2. 输入:
    b main
    r
    
  3. 程序停在 main 第一行
    → 按 Esc 切换到源码窗口,上下键翻代码
  4. 设置断点:
    b 12    # 在 for 循环那行
    
  5. F6(continue)运行到断点
  6. F7(step)单步执行,观察 i 变化
  7. 打印变量:
    p i
    p arr[0]@5
    
  8. 程序崩溃时(段错误),输入:
    bt      # 看调用栈
    

6. 常见调试场景

场景1:程序崩溃(Segmentation fault)

(gdb) r
# 崩溃
(gdb) bt
# 查看是哪一行
(gdb) f 0
(gdb) l     # 看当前行

场景2:循环没停(死循环)

b 循环行
c
# 停下后
p 变量名
# 改值测试
set var i = 100
c

场景3:条件断点(只在 i==3 时停)

b 12 if i == 3

7. 高级技巧(进阶必备)

命令 用途
watch x 当变量 x 被修改时暂停
rwatch x 当变量 x 被读取时暂停
awatch x 读或写都暂停
display i 每次停下都自动显示 i 的值
undisplay 1 取消 display
info locals 查看当前函数所有局部变量
info args 查看当前函数参数
thread apply all bt 多线程程序:查看所有线程栈

8. 练习题(动手做!)

练习1:数组越界

用上面的 bug.c,用 CGDB 找到越界位置,并用 p arr[5] 验证。

练习2:死循环

写一个死循环:

int i = 0;
while(1) {printf("%d\n", i++);if(i > 100000) break; // 故意写错条件
}

watch i 监控 i,改值跳出循环。

练习3:条件断点

在数组遍历中,只在 i == 2 时打印 arr[i]


9. 资源推荐

资源 链接
GDB 官方手册 https://sourceware.org/gdb/current/onlinedocs/gdb/
CGDB 官网 https://cgdb.github.io/
GDB 速查卡 搜索 “GDB cheat sheet”
视频教程 B站搜索 “GDB 调试教程”

总结:你的调试流程(贴在桌边!)

1. gcc -g -O0 xxx.c -o xxx
2. cgdb ./xxx
3. b main → r
4. 用 F5/F6/F7/F8 控制流程
5. p 变量 / bt 查看
6. 改值 → set var x = 100
7. 继续 → c

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

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

相关文章

Maya 2025软件超详细下载安装教程(附安装包和激活步骤)

很多朋友想用上 Maya 2025 这款专业的三维动画设计软件,却在安装环节犯了难。其实 Maya 安装并不复杂,这篇教程就把 Maya 2025 从下载到能用的每一步都说清楚,跟着做,保准你能顺利用上 Maya。目录一、Maya 2025优势…

AI元人文构想:基于价值原语和三值纠缠的权衡

AI元人文构想:基于价值原语和三值纠缠的权衡 笔者:岐金兰 摘要: 本文提出“AI元人文”构想,旨在解决AI在价值决策中的根本缺陷。该框架通过将模糊的人文价值“原语化”为可操作单元,并引入“欲望值、客观值、自感…

一款基于 .NET WinForm 开源、轻量且功能强大的节点编辑器,采用纯 GDI+ 绘制无任何依赖库仅仅100+Kb!

前言 今天大姚给大家分享一款基于 .NET WinForm 开源免费(MIT License)、轻量且功能强大的节点编辑器,采用纯 GDI+ 绘制无任何依赖库仅仅100+Kb:STNodeEditor。 项目介绍 STNodeEditor 是一款基于 .NET WinForm 开…

10-31 题

10-31 题 目录10-31 题G - Minimum PermutationG - P-smooth numberG - Dream TeamP14254 分割(divide) - 洛谷 G - Minimum Permutation 可以用一个栈维护当前选了哪些数,从前往后考虑,首先检查 \(a_i\) 是否不在…

Windows install MiniConda3

1.Download.Open command and runbelow url//In command prompt curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-Windows-x86_64.exe2.Install.Open new command window with administrator,and cd t…

109.Redis的geospatial和XXL-JOB 分布式任务调度平台整理

109.Redis的geospatial和XXL-JOB 分布式任务调度平台整理依旧是代驾项目中使用到的功能 特此总结 一个是Redis Geo用于存储和查询地理位置信息(经纬度) 一个是定时任务-分布式 XXL-JOB Redis Geohttps://redis.io/docs…

我的神奇题目

U613849 ggg 题目描述 给一个序列 \(a_i\) , \(q\)个询问L R 求从中有多少个区间 \([l,r]\) 满足 $ gcd(a_l,a_{l+1},a_{l+2},a_{r})=1 $, 输入格式 第一行一个 \(N\),满足N为正整数。 第二行序列\(a\)。 第三行 \(q…

STM32学习之概念——仿真器、调试器、下载器

stm32学习笔记STM32学习笔记 一、核心概念区分:下载 vs. 调试 首先要理解两个核心功能:程序下载:也叫编程或烧录。简单说就是把你在电脑上编译好的二进制程序文件(比如.bin或.hex文件)“灌入”到STM32芯片的内部F…

洛谷 P3273

题意直接看 原题 吧。 注意 \(-1000 \le v \le 1000\)。 这种连边的操作很容易让人想到 DSU,再一看,使用 DSU 对于每个连通块开个 set 维护最大值,整体再开个 set 维护全局最大值,不难搞出 \(O(n \log ^2 n)\) 的做…

docker compose.yaml配置

以下是一个常用的 MySQL Docker Compose 配置示例,包含数据持久化、环境变量配置、自定义配置等核心功能,适用于开发或测试环境。 1. 基础配置文件(docker-compose.yml) 创建一个 docker-compose.yml 文件,内容如…

A39C-T400A22D1a Lora通讯模块的命令配置示例记录

记录了开发中对A39C-T400A22D1a Lora模块直接发送命令进行配置的实例,作为文档的增补前言 开发的过程中,用A39C-T400A22D1aLora模块作无线传输。这个项目之前的人都是用厂商的ASDS上位机软件,直接配置Lora模块,也确…

好久没来了

好久没来了今天 Zotero出问题了!可恶

【入门】使用Node.js开发一个MCP服务器

介绍一个小小后端码农,研究了一下午,终于搞明白怎么开发一个nodeJs的MCP服务器,特写成一篇粗略的博客,供大家参考。MCP 是什么? MCP(Model Control Protocol)是一个标准化接口协议,用于定义AI工具的功能和参数…

Multisim保姆级图文下载安装教程包含下载、安装、汉化、激活

目录一、Multisim 14.3 是什么?为什么好用?二、Multisim 14.3下载三、Multisim 14.3 安装步骤(一步不落)3.1 解压安装包 3.2 进安装目录 3.3 运行安装程序 3.4 同意协议 3.5 别改安装路径 3.6 装主程序 3.7 同意组…

AgenticSeek:完全本地的AI助手,保护隐私的智能代理

AgenticSeek是一个100%本地运行的AI助手,完全替代Manus AI。支持语音交互,能够自主浏览网页、编写代码、规划任务,所有数据仅保存在您的设备上,确保完全的隐私保护和零云端依赖。AgenticSeek:完全本地的AI助手 项…

AI学习机是“智商税”吗?2025年各价位主流品牌选购指南

结论:AI学习机并非简单的“智商税”,但也不是万能神器。其价值高度依赖于产品真实的技术实力和是否契合孩子的学习需求。 🤔 一、AI学习机是智商税吗? 1️⃣ 为什么不是智商税?个性化学习:如同24小时私人教师。…

CSP-S 2025 题解

CSP-S 2025 题解 club 先贪心,每个数都选取 \(\max\)。考虑调整法解决 \(n/2\) 的限制,找到超过 \(n/2\) 的集合,按照次大值减去最大值的大小,从小到大把它们调整成次大值即可。复杂度 \(O(n\log n)\)(需要排序)…

Day30-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\annotation\Proxy

反射package Basic.src.com.reflect;import org.junit.Test;import java.lang.reflect.Method;public class Test4Method {@Testpublic void testGetMethhod() throws Exception {//1.反射第一步:先得到Class对象Clas…

JMeter生包

第一步:打开“jmeter”软件,在左侧“测试计划”右击选择“添加”——“线程组”,在fiddler中发送请求(例:登录山东商务职业学院官网登录界面),在fiddler左侧“会话列表”中双击登录界面的数据表,在右侧“请求栏”中…

洛谷 P11190

给定长度为 \(n\) 的字符串 \(s\),问至多能将 \(s\) 划分成多少个子序列,使得每个子序列都不是回文串?(输出方案) 特殊性质 A:每个字符出现次数不超过 \(\frac{n}{2}\)。 特殊性质 B:只有 a, b 两种字符。这个题…