之前写的《GDB 自动化操作的技术》一文介绍了可在gdb内部使用的DSL(领域特定语言)来自动化gdb的操作。借助该DSL,我们分别实现了一个名为mv的自定义命令,和“对账”用的调试脚本。在末尾,我提到了也可以用python来实现拓展脚本。从本篇开始,我会介绍如何使用python来给gdb编写脚本。由于篇幅所限,该教程会分成四篇,争取在本周内更完。
作为开始的热身,让我们用python重新实现前文(《GDB 自动化操作的技术》)的mv命令。
实现自定义命令
引用前文的mv命令实现如下:
# ~/.gdbinit
define mv
if $argc == 2
delete $arg0
# 注意新创建的断点编号和被删除断点的编号不同
break $arg1
else
print "输入参数数目不对,help mv以获得用法"
end
end
# (gdb) help mv 会输出以下帮助文档
document mv
Move breakpoint.
Usage: mv old_breakpoint_num new_breakpoint
Example:
(gdb) mv 1 binary_search -- move breakpoint 1 to `b binary_search`
end
对应的python实现如下:
# move.py
# 1. 导入gdb模块来访问gdb提供的python接口
import gdb
# 2. 用户自定义命令需要继承自gdb.Command类
class Move(gdb.Command):
# 3. docstring里面的文本是不是很眼熟?gdb会提取该类的__doc__属性作为对应命令的文档
"""Move breakpoint
Usage: mv old_breakpoint_num new_breakpoint
Example:
(gdb) mv 1 binary_search -- move breakpoint 1 to `b binary_search`
"""
def __init__(self):
# 4. 在构造函数中注册该命令的名字
super(self.__class__, self).__init__("mv&#