使用-g选项编译程序,使生成的可执行文件包含源代码符号信息(如函数名、变量名、行号),这是GDB等调试工具的基础。例如:
gcc -g -o myprogram myprogram.c
若需兼顾调试与轻微优化(避免过度优化干扰调试),可使用-Og选项(GCC专为调试设计的优化级别):
gcc -Og -g -o myprogram myprogram.c
GDB(GNU调试器)是CentOS上最常用的命令行调试工具,以下是其关键命令:
gdb ./myprogrammain)或行号(如10)处暂停程序:break main 或 break 10run(或r):启动程序;next(或n):单步执行(不进入函数内部);step(或s):单步执行(进入函数内部);continue(或c):继续执行至下一个断点或程序结束。print variable_name(或p variable_name):打印变量值;backtrace(或bt):查看函数调用栈(定位崩溃位置);list(或l):显示当前源代码片段。quit(或q)若程序包含多线程,GDB提供以下命令管理线程:
info threads:列出所有线程(显示线程ID、状态);thread thread_id:切换至指定线程(如thread 2);break some_function thread all:在所有线程的some_function函数处设置断点使用ldd命令查看程序依赖的共享库(如.so文件),确认库路径是否正确,避免因库缺失导致的调试问题:
ldd ./myprogram
若程序崩溃生成核心转储文件(core),可通过GDB加载可执行文件与核心文件,定位崩溃位置:
gdb ./myprogram core
随后使用backtrace命令查看崩溃时的调用栈
--leak-check=full选项显示详细泄漏信息:valgrind --leak-check=full ./myprogram-fsanitize=address选项,可快速定位内存越界、使用释放后内存等问题:gcc -g -fsanitize=address -o myprogram myprogram.c-pg选项,运行程序后生成gmon.out文件,再用gprof分析:gcc -pg -o myprogram myprogram.c./myprogramgprof ./myprogram gmon.out > analysis.txtobjdump -d ./myprogramopen、read、write)及信号,帮助定位I/O或系统交互问题:strace ./myprogramprintf、malloc),排查库函数使用错误:ltrace ./myprogram若需使用特定版本的GCC(如GCC 9、11),可通过以下方式管理:
sudo yum install centos-release-sclsudo yum install devtoolset-9-gcc*scl enable devtoolset-9 bash(临时生效);gcc-11.2.0.tar.gz),编译安装至/usr/local/gcc-11.2.0,并通过环境变量切换版本:export PATH=/usr/local/gcc-11.2.0/bin:$PATHexport LD_LIBRARY_PATH=/usr/local/gcc-11.2.0/lib64:$LD_LIBRARY_PATH使用Visual Studio Code(VS Code)等图形化IDE,通过安装C/C++插件实现可视化调试:
tasks.json文件(定义编译任务,包含-g选项);launch.json文件(设置GDB调试参数,如可执行文件路径、断点);