多数Linux发行版默认安装GDB,若未安装,可通过包管理器安装(如Ubuntu使用sudo apt install gdb,CentOS使用sudo yum install gdb)。
调试前需为程序添加调试信息(包含变量名、源代码行号等),编译时需加入-g参数。例如:
gcc -g program.c -o program(C程序)或g++ -g program.cpp -o program(C++程序)。
注意:避免使用-O(优化)参数,否则会干扰调试(如变量被优化掉,无法查看)。
在终端输入以下命令启动GDB并加载可执行文件:
gdb ./program
成功启动后,会进入GDB交互界面(提示符为(gdb))。
断点是调试的核心工具,用于让程序在指定位置暂停,方便检查状态。常见用法:
break main(在main函数开头暂停);break file.c:10(在file.c文件的第10行暂停);break file.c:10 if x == 5(当变量x等于5时,在第10行暂停)。设置断点后,使用run(或简写r)命令启动程序。若程序需要命令行参数,可紧跟参数:
run arg1 arg2(将arg1、arg2作为程序的输入参数)。
程序暂停后,可通过以下命令控制执行流程:
next(或简写n):执行下一行代码,不进入函数内部(适合快速跳过函数调用);step(或简写s):执行下一行代码,进入函数内部(适合跟踪函数内部的逻辑);finish:执行完当前函数,暂停在函数返回处(无需逐行执行函数内的代码)。print x(打印变量x的当前值);print /x x(以十六进制格式显示变量x的值);display x(每次程序暂停时,自动打印变量x的值)。使用backtrace(或简写bt)命令,显示当前函数的调用顺序(从main函数到当前函数),帮助定位崩溃发生的位置(如“段错误”通常源于非法内存访问)。
list(或简写l);list main(查看main函数的代码);list 10(查看第10行附近的代码)。调试时,可通过以下命令动态修改变量值,无需重新编译程序,快速验证假设:
set variable x = 10(将变量x的值修改为10);x/8xb &x(以十六进制查看变量x的内存布局,8表示显示8个字节,x表示十六进制格式)。使用continue(或简写c)命令,让程序从当前暂停位置继续执行,直到遇到下一个断点或程序结束。
调试完成后,使用quit(或简写q)命令退出GDB,返回终端。
使用x命令查看指定内存地址的内容,格式为x/<数量><格式><大小> <地址>。例如:
x/4xb 0x7fffffffe000(查看从地址0x7fffffffe000开始的4个字节,以十六进制格式显示)。
当程序崩溃时,系统会生成Core文件(记录崩溃时的内存状态),使用以下命令调试:
ulimit -c unlimited(解除Core文件大小限制);gdb ./program core(加载Core文件,查看崩溃时的调用栈)。对于多线程程序,可使用以下命令:
info threads(显示线程ID、状态等信息);thread 2(切换到线程ID为2的线程);break file.c:10 thread 2(仅在线程2执行到第10行时暂停)。通过以上步骤,可系统性地使用GDB调试Linux进程,快速定位逻辑错误、崩溃、死循环等问题。实践中需结合具体场景灵活运用,如通过watch命令监控变量变化、通过disassemble命令查看汇编代码等。