the GNU Project debugger
1编译
gcc *.c -o app -g // 生成的可执行app中带了调试信息(-g)
后期发布程序时不需要 -g参数
2打开gdb,设置相关断点
启动gdb,并且分屏显示源代码:
$gdb -tui
打开gdb:
gdb app
查看源代码:
l(或list,默认显示的包含main函数的文件),或 l a.c:20 查看a.c文件20行的代码,
或 l a.c:sort 查看a.c文件中的sort()函数的代码 ,然后 l 继续显示,回车是执行上次的指令
打断点:
在打开的文件中,b (或break) 20,在该文件20行打断点,可继续打其他行断点。
for循环的条件断点:b 15 if i==100
查看断点信息:
i (或info) b 。包含断点Num和状态,位置。
执行代码:
start。只执行1步就停住。
r (或run):运行,前提是先要把断点设置好
n(或next) 下一步。
c(或continue) 运行至断点,没断点就运行至结束
s(或step) 进入函数体内部,不能进入就单步,可看见函数参数值,l 可看函数代码,b可增加断点。
p(或print)+变量,查看对应参数变量值,如p array[1]
ptype+变量,查看对应变量的类型
display+变量,追踪打印变量值,可在for循环配合单步执行使用。取消追踪 undisplay+Num,Num可通过 i display查看追踪变量的Num值。
u :退出当前循环体(如跳出for循环)
finish:跳出当前函数,配合s指令使用。需要去掉当前函数里的所有断点才能跳出去,否则会等该函数执行完。
delete :删除所有断点
d(或delete)+Num,根据Num删除断点
set var +变量=10;设置变量值然后继续运行程序一步。
quit:退出gdb。
调试多线程
gdb只能跟踪一个进程,在fork()函数处中断,设置跟踪目标
set follow-fork-mode child 设置gdb在fork()函数之后跟踪子进程
set follow-fork-mode parent 设置跟踪父进程
不做设置的话默认跟踪父进程。