1. 开发调试利器GDB实战指南
记得我刚入行那会儿,最头疼的就是程序运行着突然崩溃,然后一脸茫然不知道从哪里开始排查。后来师傅教我使用了GDB,简直像是打开了新世界的大门。GDB就像是程序的X光机,能让你看清楚代码内部的每一个执行细节。
首先要确保编译时加上-g选项,这个选项会在可执行文件中嵌入调试信息。比如在Makefile中这样写:
CC = gcc
CFLAGS = -g -Wall
demo: demo.c
$(CC) $(CFGFLAGS) -o demo demo.c
这样编译出来的程序就包含了调试信息,GDB才能显示具体的代码行和变量信息。
启动GDB很简单,直接运行gdb your_program就进入了调试环境。我习惯先用list命令查看代码结构,这样心里有个底。GDB的帮助系统很强大,输入help可以看到12个大类命令,比如想查看断点相关的命令就用help breakpoints。
设置断点是调试的核心技能。我经常使用break filename:lineno在特定文件的特定行设置断点,或者用break function_name在函数入口处中断。更高级的是条件断点,比如break main.c:20 if count > 100,只有当count大于100时才会触发断点。
# 启动GDB
gdb ./demo
# 在main函数设置断点
(gdb) break main
# 在第20行设置条件断点
(gdb) break demo.c:20 if count > 100
# 查看所有断点
(gdb) info breakpoints
运行程序用run命令,程序会在第一个断点处暂停。这时候可以用next单步执行(不进入函数),或者用step单步执行(进入函数内部)。我有个小技巧:如果想让程序连续执行多步,可以用next 3这样执行3步后再暂停。
监视变量值变化是调试的另一个重要环节。print variable_name可以打印变量当前值,但如果想持续监视变量变化,最好使用watch variable_name设置观察点。一旦变量值发生变化,程序就会自动暂停。
# 运行程序
(gdb) run
# 单步执行
(gdb) next
# 打印变量值
(gdb) print count
# 设置观察点
(gdb) watch count
有时候为了测试特定场景,我需要临时修改变量值。GDB的set var variable=value命令非常实用,比如set var count=0可以将count强制设为0,测试边界情况。
当程序调用层次较深时,backtrace命令(缩写bt)可以显示完整的调用栈,让你清楚知道当前执行位置在调用链的哪个环节。如果需要查看特定栈帧的详细信息,可以用frame n切换到第n层栈帧。
实际调试中我经常遇到多线程问题。GDB的info threads可以显示所有线程信息,thread n可以切换到指定线程进行调试。这对于排查死锁、竞态条件等问题特别有用。


890

被折叠的 条评论
为什么被折叠?



