GDB 超全详解教程:零基础入门到高阶调试
一、GDB 简介与核心作用GDBGNU Debugger是 GNU 开源组织推出的跨平台、命令行式程序调试工具支持 C/C、Go、Rust 等主流编译型语言可运行在 Linux、MacOS、类 Unix 系统是后端开发、嵌入式开发、底层调试的核心工具。相较于 IDE 图形化调试GDB 轻量化、无依赖、可远程调试、支持内核级调试能够实现程序启动调试、断点调试、堆栈分析、变量监控、内存查看、异常捕获、进程附着调试等全场景调试能力是排查段错误、死循环、内存越界、堆栈溢出等疑难问题的必备工具。二、前置准备编译带调试信息的程序2.1 编译参数说明GDB 只能调试带调试符号信息的程序普通编译gcc main.c -o main会剥离调试信息无法断点、查看源码。核心编译参数-g添加基础调试信息支持源码级调试最常用-ggdb生成 GDB 专用调试信息兼容性最好推荐使用-O0关闭编译器优化默认 O2/O3 优化会打乱代码执行顺序导致调试错位标准编译命令gcc main.c -o main -ggdb -O02.2 实战示例代码全程调试使用编写main.c包含循环、函数调用、数组越界、指针操作覆盖绝大多数调试场景#include stdio.h #include string.h // 加法函数 int add(int a, int b) { int res a b; return res; } // 循环测试函数 void loop_test() { int arr[5] {1,2,3,4,5}; // 故意制造数组越界段错误隐患 for(int i 0; i 5; i) { arr[i] i * 2; printf(arr[%d] %d\n, i, arr[i]); } } int main(int argc, char *argv[]) { int x 10; int y 20; int sum add(x, y); printf(sum %d\n, sum); loop_test(); char str[4] abc; char *p str; printf(str %s\n, p); return 0; }编译命令gcc main.c -o gdb_demo -ggdb -O0生成可调试程序gdb_demo。三、GDB 调试整体流程图完整调试链路启动 GDB → 配置参数 → 设置断点 → 运行程序 → 单步调试 → 查看变量/堆栈 → 动态修改变量 → 排查异常 → 退出调试四、GDB 全量命令分类详解含简写示例本文将 GDB 所有常用命令按启动配置、断点管理、程序运行、单步调试、信息查看、堆栈分析、内存操作、动态修改、高级调试、退出配置十大类整理全覆盖日常调试场景。4.1 启动与基础配置命令用于启动 GDB、配置程序运行参数、日志、工作环境。完整命令简写功能说明实操示例gdb [程序名]无启动GDB加载可执行程序gdb ./gdb_demoset args [参数]无设置程序命令行参数set args 100 testshow args无查看已设置的命令行参数show argsset verbose on/off无开启/关闭详细调试日志set verbose ondirectory [路径]dir添加源码搜索路径dir ./srchelp [命令]h查看命令帮助文档h breakquitq退出GDB调试q4.2 断点管理命令核心高频断点是调试核心支持行断点、函数断点、条件断点、临时断点、观察断点监控变量/内存变化。完整命令简写功能说明实操示例break [行号]b在指定行设置断点b 1818行断点break [函数名]b在函数入口设置断点b addbreak [文件:行号]b多文件项目指定文件断点b main.c:22break n/-nb当前行前后n行断点b 3tbreak [位置]tb临时断点触发1次后自动删除tb loop_testbreak [位置] if [条件]b条件断点满足条件才触发b 25 if i5watch [变量]w写观察断点变量被修改触发watch sumrwatch [变量]rw读观察断点变量被读取触发rw xawatch [变量]aw读写观察断点读/改均触发aw arr[i]info breakpointsi b查看所有断点列表i bdelete [断点号]d删除指定断点无参数删除全部d 1/ddisable [断点号]dis禁用断点保留不删除dis 2enable [断点号]ena启用禁用的断点ena 24.3 程序运行与继续命令控制程序启动、暂停、重启、继续运行。完整命令简写功能说明实操示例runr从头运行程序触发断点暂停rcontinuec暂停后继续运行到下一个断点cstart无启动程序暂停在main函数第一行startkillk终止当前正在调试的程序krestartrs重启程序调试rs4.4 单步调试命令逐行执行精准控制代码执行流程区分进入函数和跳过函数是逐行排错核心。完整命令简写功能说明适用场景steps逐行执行进入自定义函数内部需要调试函数内部逻辑nextn逐行执行跳过函数不进入内部确认函数无问题快速跳过finishfin执行完当前函数跳出到函数调用处误入无需调试的函数快速退出untilu运行到指定行或跳出循环体跳出死循环、快速跑完循环核心区别s会进入函数n直接执行完函数返回结果不进入内部。4.5 源码查看命令调试过程中实时查看源码无需退出 GDB。命令简写功能示例listl查看当前行上下10行源码llist 行号l查看指定行附近源码l 20list 函数名l查看指定函数源码l addset listsize N无设置list显示行数set listsize 204.6 变量与表达式查看命令调试最常用命令用于查看变量、数组、指针、表达式运算结果。命令简写功能示例print [变量/表达式]p打印变量值、运算表达式p x、p xyprint /x 变量p/x十六进制打印p/x sumprint /d 变量p/d十进制打印默认p/d xprint /c 变量p/c字符格式打印p/c str[0]display [变量]disp每次暂停自动打印变量disp iundisplay [编号]undisp取消自动打印undisp 1info localsi lo查看当前函数所有局部变量i loinfo argsi ar查看当前函数参数i ar4.7 堆栈调试命令排查崩溃核心程序段错误、崩溃时通过堆栈查看函数调用链路定位崩溃代码行。命令简写功能示例backtracebt查看完整堆栈调用链路btbt Nbt N只查看顶部N层堆栈bt 3frame [堆栈号]f切换到指定堆栈帧f 2up无切换到上一层堆栈updown无切换到下一层堆栈down4.8 内存与指针调试命令查看内存数据、指针指向、数组内存排查内存越界、野指针问题。命令功能说明示例x /[格式][长度] 地址查看指定内存数据x/10dw p查看指针p指向的10个int数据print *指针解引用指针查看指向数据p *pinfo memory查看程序内存布局info memoryx命令格式详解x/数量 格式 宽度 地址格式d十进制、x十六进制、c字符、s字符串宽度b字节、w4字节、g8字节4.9 动态修改变量与运行时修改无需重新编译实时修改变量值快速验证逻辑。命令功能示例set 变量值修改变量值set x100set ptr地址修改指针指向set pstr14.10 高阶调试命令4.10.1 附着正在运行的进程无需重启程序调试正在后台运行的进程排查死循环、卡死问题。# 1. 查看进程PID ps -ef | grep gdb_demo # 2. 附着进程 gdb attach 进程PID # 3. 调试完成后分离进程不杀死进程 detach4.10.2 核心转储文件调试崩溃复盘程序崩溃生成 core 文件后通过 GDB 复盘崩溃现场# 开启core文件生成 ulimit -c unlimited # 调试core文件 gdb ./gdb_demo core.xxx4.10.3 日志与批量调试save breakpoints 文件名保存所有断点到文件source 文件名加载保存的断点配置set logging on开启GDB日志保存调试过程五、完整实战调试流程手把手演示5.1 启动调试设置断点# 启动gdb gdb ./gdb_demo # 在add函数、loop_test函数设置断点 (gdb) b add (gdb) b loop_test # 查看断点 (gdb) i b # 运行程序 (gdb) r5.2 逐行调试与变量查看# 触发add函数断点查看函数参数 (gdb) i ar # 单步执行 (gdb) s # 查看局部变量res (gdb) p res # 跳出当前函数 (gdb) fin # 继续运行到下一个断点 (gdb) c5.3 条件断点排查数组越界# 在循环行设置条件断点i5时暂停越界位置 (gdb) b 25 if i5 (gdb) c # 查看数组内存 (gdb) x/6dw arr # 修改变量规避错误验证逻辑 (gdb) set i4 # 继续运行 (gdb) c5.4 堆栈崩溃排查演示程序因数组越界触发段错误后# 查看崩溃堆栈 (gdb) bt # 切换到崩溃堆栈帧 (gdb) f 0 # 查看当前变量 (gdb) i lo可精准定位到i5时数组越界的问题。六、高频问题与调试技巧6.1 调试错位问题现象断点行和执行行不匹配原因编译器优化解决方案编译必须加-O0 -ggdb。6.2 找不到源码问题解决方案使用dir 源码路径添加源码搜索目录。6.3 重复调试快捷操作回车重复执行上一条命令r一键重启调试无需退出GDB保存断点避免每次重启重新设置断点GDB 调试核心逻辑可总结为断点精准定位、单步逐行排查、变量实时监控、堆栈回溯溯源、动态修试验证。本文覆盖了 GDB 全部高频、高阶命令搭配可直接运行的示例代码和完整调试流程能够满足日常开发、嵌入式调试、崩溃排错等所有场景。熟练掌握 GDB 可快速定位段错误、内存越界、死循环、逻辑异常等疑难问题是程序员必备的底层调试能力。

相关新闻

【Linux系统篇(一)】Linux入门基础指令(一)

【Linux系统篇(一)】Linux入门基础指令(一)

在上一篇文章中,我们已经谈过Linux的历史以及如何使用云服务器配置Linux环境和使用Xshell来使用Linux,那么我们在本篇文章中将要开始学习Linux的一些基础指令。 目录 一、关于图形化界面 二、Linux文件以及目录结构 2.1 怎么理解文件 2.2 Linux的文…

2026/10/9 22:05:05 阅读更多 →
OpenClaw-RL:大模型规划与强化学习协同的智能体自主进化框架

OpenClaw-RL:大模型规划与强化学习协同的智能体自主进化框架

1. 从“边聊边学”到“自主进化”:OpenClaw-RL的范式革新最近在智能体开发圈子里,一个叫OpenClaw-RL的项目讨论度挺高。乍一看标题“边聊边学的智能体变强秘笈”,很多人可能会觉得这又是一个基于大语言模型(LLM)的对话…

2026/10/15 15:51:03 阅读更多 →
得州州长宣布暂停数据中心新电网连接申请,待评估项目影响

得州州长宣布暂停数据中心新电网连接申请,待评估项目影响

得州暂停数据中心新电网连接申请美国数据中心建设热潮在得克萨斯州表现得最为明显。然而,州长格雷格阿博特在宣称得州是“人工智能发展的中心”还不到一年,于 8 月 3 日宣布暂停所有数据中心与电网的新连接申请,至少要等开发者提供更多关于项…

2026/10/4 18:54:30 阅读更多 →

最新新闻

手写Newton-Raphson求解器:Matlab非线性方程数值求解实战

手写Newton-Raphson求解器:Matlab非线性方程数值求解实战

1. 这不是“套公式”,而是亲手搭建一个非线性方程求解引擎你有没有试过解这样一个方程组:$$ \begin{cases} x^2 y^2 - 4 0 \ e^{x} y - 3 0 \end{cases} $$它看起来简单,但代入消元?行不通。画图找交点?只能估个大…

2026/10/16 0:46:27 阅读更多 →
libvirt是什么?一文吃透虚拟化管理核心技术与实践

libvirt是什么?一文吃透虚拟化管理核心技术与实践

1. libvirt是什么,以及它到底解决了什么问题如果你接触虚拟化有一阵子,大概率听过“libvirt”这个名字,但很多人对它的认知停留在“一个管理虚拟化的库”这种模糊层面。我最早接触它时也有同样的困惑:明明有QEMU命令行、有KVM内核…

2026/10/16 0:46:27 阅读更多 →
用PMAT自动识别Java代码中的设计模式与类指标

用PMAT自动识别Java代码中的设计模式与类指标

简介:IBM Pattern Modeling and Analysis Tool for Java是IBM推出的Java GC专项分析工具,面向Java开发者与性能调优工程师,核心价值在于解析JVM生成的GC日志,将抽象回收行为转化为可视化报告,帮助定位GC停顿过长、内存…

2026/10/16 0:45:27 阅读更多 →
Java微信支付H5接入教程:从下单签名到回调验签解密

Java微信支付H5接入教程:从下单签名到回调验签解密

简介:这是一份面向Java开发者的H5微信支付接入实战资料包,主要解决电商网站、移动端网页等场景下的微信公众号H5支付集成问题。内容围绕微信支付核心流程展开,覆盖官方接口文档解读、统一下单获取prepay_id、支付链接与二维码生成、H5页面调起…

2026/10/16 0:45:27 阅读更多 →
无人机纯方位无源定位:从三组方位角反推坐标的MATLAB实现

无人机纯方位无源定位:从三组方位角反推坐标的MATLAB实现

简介:本资源为2022年全国大学生数学建模竞赛本科组B题的完整论文PDF,聚焦无人机纯方位无源定位问题,适合备战数模竞赛的本科生及指导教师参考。论文围绕圆形与锥形两种编队,系统建立被动接收信号无人机的定位模型与位置调整模型&a…

2026/10/16 0:45:27 阅读更多 →
优秀数学建模论文解读:从C3289拆解建模与求解方法论

优秀数学建模论文解读:从C3289拆解建模与求解方法论

简介:第八届MathorCup数学建模竞赛优秀论文C3289以陆基导弹打击航母为背景,完整展示从问题重述、模型假设到分段建模、可视化实现与误差分析的竞赛方案。整包仅含1个PDF文件,大小约511KB,适合数学建模参赛者、军事运筹研究者及对优…

2026/10/16 0:45:26 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →