在CentOS系统中,需先确保安装了GCC编译器(用于编译程序)和GDB调试器(用于调试程序)。可通过以下命令一键安装:
# 安装GCC编译器及基础开发工具(含make、libc等)
sudo yum groupinstall "Development Tools"
# 安装GDB调试器
sudo yum install gdb
安装完成后,可通过gcc --version和gdb --version验证是否安装成功。
使用GCC编译C/C++程序时,必须添加-g选项,该选项会在生成的可执行文件中嵌入源代码的符号信息(如函数名、变量名、行号等),这是GDB调试的基础。
示例(编译test.c生成test可执行文件):
gcc -g test.c -o test
注意:若未添加-g选项,GDB将无法显示源代码或定位变量,调试功能将受限。
通过GDB加载编译好的可执行文件,启动调试会话:
gdb ./test
启动后,GDB会显示版本信息及程序入口(如(gdb)提示符),此时可输入调试命令。
调试过程中,常用命令如下(按功能分类):
list(或l):显示当前位置的源代码(默认显示10行);list 行号(如list 5)显示指定行附近的代码;list 函数名(如list main)显示指定函数的代码。break 行号(如break 10):在指定行设置断点;break 函数名(如break main):在指定函数开头设置断点;break 文件名:行号(如break test.c:15):在指定文件的指定行设置断点。run(或r):启动程序,若设置了断点,程序会在断点处暂停;run 参数1 参数2:传递命令行参数给程序(如run arg1 arg2)。next(或n):执行下一行代码,不进入函数内部(如调用printf时,直接执行完该函数);step(或s):执行下一行代码,进入函数内部(如调用func()时,会进入func函数的代码)。print 变量名(或p 变量名):显示指定变量的值(如print a显示变量a的值);print 变量名=新值(如print a=20)可修改变量值。backtrace(或bt):显示当前函数的调用栈(如main调用func1,func1调用func2,则会显示func2→func1→main的调用顺序),帮助定位程序执行路径。continue(或c):从当前断点继续执行程序,直到遇到下一个断点或程序结束。quit(或q):退出GDB调试会话。test.c为例)假设有以下简单C程序(test.c):
#include <stdio.h>
int main() {
int a = 5;
int b = 10;
int c = a + b;
printf("The sum of a and b is: %d\n", c);
return 0;
}
调试步骤:
gcc -g test.c -o test
gdb ./test
main函数开头设置断点:(gdb) break main
Breakpoint 1 at 0x400536: file test.c, line 5.
(gdb) run
Starting program: /root/test
Breakpoint 1, main () at test.c:5
5 int a = 5;
main函数):(gdb) step
6 int b = 10;
a的值:(gdb) print a
$1 = 5
(gdb) continue
The sum of a and b is: 15
[Inferior 1 (process 12345) exited normally]
(gdb) quit
若需要使用特定版本的GCC(如CentOS 7默认GCC版本较旧),可通过Devtoolset安装新版本GCC,并切换环境:
# 安装Devtoolset(以devtoolset-11为例)
wget http://people.centos.org/tru/devtools-11/devtools-11.repo -O /etc/yum.repos.d/devtools-11.repo
sudo yum -y --enablerepo=devtools-11-devtools-11 install devtoolset-11-gcc devtoolset-11-gcc-c++
# 启用Devtoolset环境(临时生效)
source /opt/rh/devtoolset-11/enable
# 验证GCC版本
gcc --version # 应显示devtoolset-11的GCC版本(如gcc (GCC) 11.3.1 20210422)
使用devtoolset-X-gcc(如devtoolset-11-gcc)代替gcc编译程序即可。