幽暗深处的低语:探索那片未知的风景
Linux 调试神器 gdb / cgdb 实战指南从零基础到生产环境能用得上2025–2026 年仍然最实用的内容先回答最核心的三个问题gdb 和 cgdb 有什么本质区别gdb → 纯命令行功能最全但交互体验差cgdb → gdb 的前端在终端里提供类似 vim 的界面 代码高亮 分屏什么时候用 gdb什么时候用 cgdb只用 gdb远程调试、核心 dump 分析、脚本自动化、容器内无图形界面优先 cgdb本地开发、本机有终端、需要频繁看源代码、单步跟踪逻辑现代替代品已经很多了为什么还要学 gdb/cgdb因为在以下场景中gdb 仍然无可替代或性价比最高核心 dump 分析线上崩溃多线程死锁/竞争信号处理异常远程调试ssh gdbserver没有 IDE 的环境容器、嵌入式、老服务器需要极致控制汇编级、寄存器、内存
最快上手 cgdb推荐新手第一步安装主流发行版# Ubuntu/Debiansudoaptinstallcgdb# CentOS/RHEL/Fedorasudodnfinstallcgdb 或sudoyuminstallcgdb# Archsudopacman -S cgdb最常用启动方式带源码调试# 编译时一定要加 -g 最好再加 -O0gcc -g -O0 -otesttest.c# 方式1最推荐cgdb ./test# 方式2带参数cgdb --args ./test arg1 arg2# 方式3附加到已运行进程cgdb -ppidcgdb 界面快捷键速查必须记住前 8 个按键作用备注F5运行到 main或继续最常用F6下一行next不进入函数F7单步进入step进入函数内部F8跳出当前函数finish非常实用Ctrl L刷新屏幕界面乱了按这个经常需要:进入 gdb 命令模式想输入复杂命令时q退出 cgdb—Ctrl x Ctrl a切换焦点代码窗口 ↔ 命令窗口很重要b 行号/函数名设置断点b main / b 42 / b funcccontinue继续执行—rrun从头重新运行—
gdb 核心命令分层速查表生产最常用
程序启动与退出类(gdb) run [参数] # 启动程序r / run (gdb) run input.txt # 重定向输入 (gdb) kill # 杀死当前被调试程序 (gdb) quit # 退出 gdb
断点管理最核心b main # 在 main 函数入口设置断点 b file.c:123 # 指定文件 行号 b func if x 10 # 条件断点 info breakpoints # 查看所有断点i b delete 1 # 删除 1 号断点 clear main # 清除 main 处的断点 disable 2 # 禁用 2 号断点不禁用编号 enable 2 # 重新启用
单步执行家族必背n / next # 下一行不进入函数 s / step # 单步进入进入函数 finish # 执行到当前函数返回 until 行号/地址 # 运行到指定行/地址 c / continue # 继续运行到下一个断点/信号
查看数据最常用组合p / print 变量名 # 最常用 p *array10 # 打印数组前10个元素 p /x 变量 # 十六进制 p /t 变量 # 二进制 p $rax # 看寄存器x86_64 display /i $pc # 每次停下显示当前指令汇编 info locals # 当前栈帧局部变量 info args # 当前函数参数 bt / backtrace # 调用栈崩溃必看 frame 2 # 切换到第2层栈帧
线程与多线程调试info threads # 查看所有线程 thread 2 # 切换到 2 号线程 break func thread 3 # 只在 3 号线程的 func 处断点 set scheduler-locking on # 只让当前线程运行排查死锁神器 set scheduler-locking off # 恢复多线程调度
核心 dump 分析线上最重要#
产生 core 文件需先设置ulimit-c unlimitedecho/tmp/core-%e-%p/proc/sys/kernel/core_pattern#
崩溃后分析gdb ./your_program /tmp/core-your_program-12345# 然后直接 bt、p、info threads 等
生产环境中真正高频的高级技巧远程调试ssh gdbserver被调试机gdbserver :1234 ./your_program arg1 arg2本地gdb ./your_program(gdb)target remote 被调试机IP:1234条件断点 命令列表自动打印 继续break func commands silent # 不显示停顿提示 print x,y,z continue end保存/加载断点save breakpoints breakpoints.gdb source breakpoints.gdbwatch 监视变量变化神器watch global_var watch *(int*)0x7fffffffdc40 # 监视某个内存地址反汇编 寄存器级调试disas /m main # 带源码的汇编 layout asm # cgdb 里切换到汇编视图 layout split # 源码汇编同时看
快速进阶建议路线7–14 天Day 1–2熟练 cgdb 界面 基本断点/单步/打印Day 3–4掌握条件断点、watch、多线程切换Day 5–6练习 core dump 分析自己 kill -6 制造崩溃Day 7远程调试 真实项目跟踪nginx/redis/mariadb 源码级调试你现在最想先解决哪个痛点界面操作不熟练cgdb 快捷键记不住多线程死锁怎么定位core 文件打不开 / bt 没符号远程服务器上怎么调试想看某个具体程序nginx/redis/mysql的 gdb 实战案例告诉我你的具体场景或卡点我可以给你针对性的命令序列或调试流程。
免费观看60分钟高清电视剧大全视频-免费观看60分钟高清电视剧大全视频应用