本文系统梳理Ubuntu环境下C程序调试的完整流程,从基础入门到进阶实战,基础部分详解gdb调试器的核心操作,包括程序启动、断点设置、变量监控、堆栈跟踪等技巧,并介绍gcc编译选项-g的使用方法,进阶内容聚焦复杂场景调试,如多线程程序中的线程同步问题、valgrind工具检测内存泄漏与越界访问、perf性能分析定位瓶颈,以及core文件异常定位,通过结合实例演示,帮助开发者掌握从单步调试到深度问题排查的全链路技能,提升Ubuntu环境下C程序调试效率与问题解决能力。
在Linux系统开发中,C语言因其高效性和灵活性被广泛应用,而调试是程序开发中不可或缺的一环,Ubuntu作为最受欢迎的Linux发行版之一,提供了强大的调试工具链,本文将详细介绍在Ubuntu环境下调试C程序的完整流程,从环境准备到进阶技巧,帮助开发者高效定位和修复代码问题。
环境准备:安装必要的调试工具
在开始调试前,需确保系统已安装编译器和调试工具,Ubuntu默认可能未安装这些工具,可通过以下命令安装:
安装GCC编译器
GCC是Linux下最常用的C语言编译器,负责将源代码转换为可执行文件,并支持生成调试信息。

sudo apt update sudo apt install build-essential
build-essential包会自动安装GCC、GDB(调试器)及相关依赖。
验证安装
安装完成后,可通过以下命令检查GCC和GDB的版本:
gcc --version # 查看GCC版本 gdb --version # 查看GDB版本
若显示版本号,则表示安装成功。
编译带调试信息的C程序
调试器需要通过编译时生成的调试信息(如变量地址、行号映射等)来定位代码问题,编译时必须添加-g选项,以生成包含调试符号的可执行文件。
示例:编译带调试信息的程序
假设有一个简单的C程序test.c:
#include <stdio.h>
int add(int a, int b) {
return a + b;
}
int main() {
int x = 10;
int y = 20;
int result = add(x, y);
printf("10 + 20 = %d\n", result);
return 0;
}
使用-g选项编译:
gcc -g -o test test.c
-g:生成调试信息,使GDB能够关联源代码与机器指令。-o test:指定输出可执行文件名为test(默认为a.out)。
使用GDB进行基础调试
GDB(GNU Debugger)是Linux下标准的调试工具,支持设置断点、单步执行、查看变量、内存分析等功能,以下是GDB的常用操作流程。
启动GDB
进入终端,使用以下命令启动GDB并加载可执行文件:
gdb ./test
启动后,GDB会显示提示符(gdb),等待输入调试命令。
常用GDB命令
(1)查看代码
list(或l):显示源代码,默认显示10行,可指定行号或函数名。(gdb) list main # 显示main函数附近的代码 (gdb) list 5 # 从第5行开始显示代码
(2)设置断点
断点是调试的核心,程序执行到断点时会暂停,允许检查当前状态。
break(或b):设置断点,支持行号、函数名、条件断点等。(gdb) break main # 在main函数入口处设置断点 (gdb) break 10 # 在第10行设置断点 (gdb) break add if a == 5 # 在add函数设置条件断点(仅当a=5时触发)
info breakpoints(或info b):查看所有断点信息。delete(或d):删除断点,如delete 1删除编号为1的断点。
(3)运行程序
run(或r):启动程序,执行到第一个断点或程序结束。(gdb) run
若程序需要命令行参数,可在
run后添加,如run arg1 arg2。
(4)控制程序执行
next(或n):单步执行,不进入函数内部(逐过程执行)。step(或s):单步执行,进入函数内部(逐语句执行)。continue(或c):继续执行,直到遇到下一个断点或程序结束。finish:执行到当前函数返回,并显示函数返回值。
(5)查看变量值
print(或p):打印变量或表达式的值,支持修改变量值。(gdb) print x # 打印变量x的值 (gdb) print x + 5 # 打印表达式x+5的值 (gdb) set var x = 100 # 修改变量x的值为100
display:持续显示变量值,每次程序暂停时自动打印。(gdb) display y # 每次暂停时显示y的值
undisplay:取消持续显示,如undisplay 1(编号可通过info display查看)。
(6)查看调用栈
backtrace(或bt):显示当前函数的调用栈(从main函数到当前执行的位置),帮助理解程序执行流程。(gdb) bt
(7)退出GDB
quit(或q):退出GDB,若程序正在运行,会
文章版权声明:除非注明,否则均为xmsdn原创文章,转载或复制请以超链接形式并注明出处。

