GDB 调试器1. 调试前准备1.1 编译带调试信息的程序必须要使用 GDB编译时必须加上-g选项建议同时关闭优化gcc -g -O0 -o demo demo.c-g在可执行文件中生成调试符号源码行号、变量名等。-O0关闭编译器优化。优化后的代码行号可能与源码错位变量可能被存入寄存器导致无法查看。2. 启动与基础控制启动调试gdb ./demo带参数运行(gdb) run arg1 arg2退出 GDB(gdb) quit或q3. 断点管理 (Breakpoints)断点是让程序在指定位置暂停执行的“监控点”。命令说明break main在main函数入口设置断点break demo.c:n在demo.c文件的第 n 行设置断点break demo.c:n if x 10条件断点仅当x 10时才暂停info break查看所有已设置的断点及其编号delete n删除编号为 n 的断点disable n/enable n禁用 / 启用编号为 n 的断点tbreak demo.c:30临时断点触发一次后自动删除4. 程序执行与单步控制命令简写说明runr从头开始运行程序直到遇到断点continuec继续执行直到遇到下一个断点或程序结束nextn单步执行不进入函数内部把函数当作一行执行steps单步执行进入函数内部逐行调试finish-一直执行到当前函数返回然后暂停until-继续执行到当前循环结束跳出循环5. 数据查看与修改5.1 查看变量与内存print x或p x打印变量x的值。print /x x以十六进制格式打印变量。display x设置自动显示每次程序暂停时都会自动打印x的值。info locals查看当前函数所有的局部变量。info registers查看 CPU 寄存器的当前状态。5.2 修改变量动态干预set variable x 100在运行时强行将变量x的值修改为 100。5.3 监视变量变化 (Watchpoints)watch x当变量x的值发生改变时程序自动暂停。非常适合排查“谁偷偷修改了这个变量”。6. 堆栈分析 (Stack Trace)当程序崩溃如 Segmentation fault或逻辑混乱时堆栈分析是定位问题的终极武器。backtrace或bt打印完整的函数调用链。崩溃时最顶部的栈帧就是出错的位置。frame 2切换到调用栈的第 2 层。info frame查看当前栈帧的详细信息如局部变量地址、参数等。7. 进阶Core Dump 崩溃快照分析当程序在生产环境崩溃时无法实时挂载 GDB此时需要分析 Core Dump 文件。7.1 开启 Core Dump 生成ulimit -c unlimited # 临时开启允许生成无大小限制的 core 文件7.2 调试 Core 文件程序崩溃后会在当前目录生成core或core.xxxx文件gdb ./demo core.xxxx进入 GDB 后直接输入bt查看崩溃时的调用栈配合frame n和info locals即可还原崩溃现场。8. 进阶附加到正在运行的进程如果服务器上的程序卡死或陷入死循环可以在不重启程序的情况下进行调试找到进程 PIDps -ef | grep demo附加 GDBsudo gdb -p PID此时程序会被暂停你可以使用bt查看卡在哪一行或使用info threads查看多线程状态。调试完毕后输入detach分离进程程序继续运行或quit退出程序会被终止。9. 提升效率的 GDB 配置在用户主目录创建~/.gdbinit文件添加以下配置可大幅提升体验set style enabled on # 开启彩色高亮显示set output-radix 16 # 默认以十六进制显示数字define r # 设置快捷命令run配置后在 GDB 中只需输入r即可直接运行程序。