在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
编译程序即可。