gdb脚本在在线调试时很有用处,使业务流程不被中断的情况下产生需要的调试信息,在不需要人工干预的情况下通过set logging file FILENAME
和set logging on
来实现将调试信息输出到文件。我们直接查看log文件就可以得到我们需要的调试信息了。
gdb调试脚本我知道的有两种,一种是直接写gdb命令,一种是python脚本。
gdb命令方式更直接且方便,但是支持的逻辑有限只有if
、while
、loop
等几种,并且缺乏对文本的解析。python适合写比较复杂的解析过程,结合re
模块功能很强大。
gdb加载脚本的方式有
-
autoload方式
-
gdb -x script方式
-
gdb命令
source script
方式
autoload
方式需要把 脚本放置到/usr/share/gdb/auto-load/usr/lib/
目录下,当前目录默认会有libstdc++.so.6.0.18-gdb.py
脚本了。
其他两种方式都是手工加载的。
gdb脚本支持所有的gdb指令,直接写gdb脚本的示例:
file bin
set logging on gdb.log
break function
command
p $pc
frame
info register
//其他一些事情
countinue
end
run
python脚本需要gdb模块的支持,他一般位于/usr/share/gdb/python/gdb
目录,详细的帮助可以通过help(gdb
)来获取,我就不多说了,gdb python
脚本的示例:
import regdb.execute("set logging on db.log")
class A(gdb.Function):
def __init__(self):
super(A, self).__init__("a")
def invoke(self, str):
re.search("\t", str)
//do()
return str
gdb.execute("a")
在测试环境下,直接gdb -x script bin
执行就可以了。当然如果是生产环境下,就可能在出错的时候通过ptracte等方式来触发了。