最近频繁用到一些GDB看上比较高大上的点,总结一下以作备忘。
1、gdb脚本
调试过程中,经常会用到需要频繁的设置相同的断点,每次在gdb启动之后重新设置一遍,会让人无比的蛋疼,这个时候采用gdb脚本无意会减轻点淡淡的忧伤。使用gdb脚本主要有两种方式:
1)gdb启动时
把gdb的调试命令全部写入到.gdbinit文件中。在gdb启动时,会自动读取.gdbinit文件的内容,执行对应的gdb命令。写入到.gdbint文件中的无非就是之前在gdb命令行中设置的gdb命令,例如:
2)gdb运行时
把gdb命令写入到脚本文件中,在gdb运行过程中,执行source script-file来执行设置gdb命令;
2、条件断点
条件断点是gdb一个比较高达上的特性,在调试比较复杂的项目时,尤其是在面对循环次数比较多或者条件判断比较多时,条件断点无疑是个很好的使用场景。在gdb命令比较常见的支持条件断点的命令主要有break和watch,条件断点的格式为:
break(或watch) if [条件语句]
在执行过程中,每次执行该位置,都会执行一次‘条件语句’的判定,为真,则在该位置暂停运行,可以手工执行后面的调试过程。
条件断点针对在现网运营的服务进行调试使用的也比较多,但是满足条件就会暂停服务的运行,会给其他用户带来非常槽糕的体验,这个时候可以写几行停止维护命令。类似开发语言中 if {}相同,执行if后面的命令之后,继续原有服务的运行。停止维护命令格式为:
break foo if x > o
commands
printf "x is %d\n",x
c
end
当 x > 0时,执行后面的命令,打印x完成之后,继续运行后面的服务
3、调用函数
在gdb中直接调用程序中的函数,无疑是个非常有用的特效。在开发测试过程中,可以通过gdb调用函数的方式来测试函数在各种边界条件下是否运行正常。调用函数的方式主要有两种:
1)call <exp>
2)print <exp>
4、设置gdb日志
1)打印部分gdb调试日志
set logging file
gdb set logging on
gdb set logging off
2)打印整个会话
gdb |tee newfile