【Linux】GDB 调试:定位问题的利器

printf 调试可以解决一部分简单问题,但面对段错误、逻辑错误、需要逐行观察变量变化的场景,调试器才是真正的生产力工具。gdb 是 Linux 下 C/C++ 的标准调试器,cgdb 提供了一个更友好的分屏界面(上屏代码,下屏命令),可以先装好备用:

bash

复制代码
# CentOS
sudo yum install -y cgdb

# Ubuntu
sudo apt install -y cgdb

1. 前提:编译时必须加 -g

gcc 默认生成的是 release 版本,不含调试信息。要让 gdb 工作,编译时必须加 -g 选项:

bash

复制代码
gcc -g mycmd.c -o mycmd

file 命令可以确认是否包含调试信息:

bash

复制代码
$ file mycmd
# ... with debug_info, not stripped

2. 常用命令速查

命令 简写 作用
list l 显示源码,从上次位置继续,每次10行
list main l main 显示 main 函数附近的源码
run r 从头运行程序
break 20 b 20 在第20行设置断点
break main b main 在 main 函数入口设断点
info break info b 查看所有断点
delete {编号} d {编号} 删除指定编号的断点
step s 单步执行,进入函数内部(F11)
next n 单步执行,跳过函数体(F10)
continue c 继续运行到下一个断点
finish - 执行当前函数直到返回
print var p var 打印变量的值
backtrace bt 显示函数调用栈
set var x=10 - 运行时修改变量值
quit q 退出 gdb

3. 提高效率的技巧

条件断点 :循环到第30次时才中断,不需要手动按30次 continue

bash

复制代码
# 方式1:新建带条件的断点
(gdb) b 9 if i == 30

# 方式2:给已有断点追加条件
(gdb) condition 2 i == 30

condition 2 i==30 的意思是给编号为2的断点加一个触发条件,只有 i 等于 30 时才停在那个断点处。注意与新建条件断点时写法的区别:condition 不用写 if

watch 监视变量 :如果你怀疑某个变量被意外修改,但又不知道在哪被改的,用 watch

bash

复制代码
(gdb) watch result

一旦 result 的值发生变化,gdb 会立刻暂停并通知你新旧值。这对查找数据损坏类的 bug 往往有奇效。

display 自动显示:每次停在断点或单步时,自动输出指定变量:

bash

复制代码
(gdb) display i

set var 现场验证

bash

复制代码
(gdb) set var flag=1

不需要重新编译,就可以修改内存中变量的值验证猜测。如果改完之后程序行为恢复正常,说明问题出在这个值被错误赋值的路径上。如果不恢复,说明根源在别处。

4. cgdb 分屏操作

cgdb 可以让你在调试时同时看到源码和 gdb 命令窗口。按 ESC 进入源码窗格(可以用 j/k 上下翻),按 i 回到命令输入窗格。这个分屏设计直接把"看代码"和"下命令"合在一个视图里,省了在编辑器和终端之间频繁切换的精力。

gdb 是跟着你的项目长大的工具。一开始可能觉得"printf 就够用",但当你面对复杂的段错误、多线程竞态条件、或者需要在运行时修改变量值来验证推测时,gdb 的投资回报率会非常可观。

相关推荐
辉灰笔记7 小时前
MySQL8 意外关机/误移data目录导致服务启动失败 PID报错/权限报错 修复文档
linux·数据库·mysql·centos
snow@li7 小时前
Java:Java 服务器(Web 容器 / Servlet 容器)完整工作清单
java·服务器·前端
胖兔纸28 小时前
OpenStack 1.7.2 & Ceph 9.2.1 运维命令
运维·ceph·openstack
JL158 小时前
Agent工程-为什么Agent必须有观测和Tracing
服务器·网络·人工智能·安全
不会C语言的男孩8 小时前
Docker 在嵌入式设备中的常用玩法
运维·docker·容器
神州世通8 小时前
IP Office内置外显卡兼容性说明
服务器·网络·tcp/ip
ylscode8 小时前
CVE-2026-31694 漏洞深度分析:Linux 内核 FUSE 组件存在本地提权风险,普通用户可直取 root 权限
linux·运维·服务器
frank00600719 小时前
Rocky 9.8设置本地yum源
服务器
智脑API平台9 小时前
Codex CLI 怎么用 .env 配置 API Key?本地项目和自动化脚本接入教程
运维·自动化
土星云SaturnCloud9 小时前
边缘计算在储气库调峰智能管控中的应用:架构设计与技术解析
服务器·人工智能·ai·边缘计算