调试器¶
调试课第一单元的编程练习,就是建一个蟒蛇版的蜘蛛网,Sorry,是Python版的捉虫调试器。
建一个简单的、交互式的调试器,来帮助我们捉虫,既然要诚心诚意地建这么个工具,我们就在发慈悲地给它起个名字——spyder,simple python debugger,一语N关,此名得之。
spyder调试器是个命令行调试器,想到gdb了是吧?当然没法跟人家比了,哪怕是自家孩子,咱们也要有自知之明嘛。如果你愿意给它打扮一下,武装到牙齿,上装备(gui)的话,就可以变成图形界面调试器了。无聊的话,每次调试还可以配个蜘蛛爬的动画……
主要功能¶
- 交互式调试
- 增加断点(break)
- 恢复执行(run)、
- 输出(print)等等
后面还会再补充其他的。
如何实现¶
这样一个调试器的实现,最重要的当然还是如何使得程序的执行听从指挥,而不是默认的嗯一撸到底。就像Linux下的c语言有ptrace函数一样(我没用过),python同样有自己的骄傲,sys模块里的settrace函数可以助我们一臂之力。
sys.setrace()¶
sys.settrace(trace_function) 函数可以设置全局调试跟踪函数,在参数trace_function每次调用时,它也会被调用到,而与之搭档的function (此处起名traceit)也有一定的模式
traceit就相当于一个回调callback函数, Python代码在每执行一行后,就会调用这个函 数, 所以会给这个函数传相应的程序信息, 归类如下:
- 文件相关
- 行数
- 文件名
- 变量列表
- 应该还有函数名?
- 事件
- 执行某一行 line
- 调用函数 call
- 返回 return
- 异常 exception
- 等等
- 外界参数
所以,我们设计的 traceit函数将接收如上三个参数, 并做出一番处理
traceit¶
def traceit(frame, event, trace_arg):
# 全局变量定义,对应命令行的控制参数
global stepping
# 事件处理event == ,常用事件类型有'call', 'line', 'return', 'exception', 'c_call', 'c_return', 'c_exception'
if event == 'line':
if stepping or breakpoints.has_key(frame.f_lineno):
resume = False
while not resume:
print event, frame.f_lineno, frame.f_code.co_name, frame.f_locals
command = input_command()
resume = debug(command, frame.f_locals)
return traceit
因为太久了, 已经忘记内容了~~~还算清楚,但也解释下
- stepping是 单步调试标志
- 对比当前事件 event
- breakpoints 显然就是断点集合了, 格式是 {文件名+行号: T/F}
- debug 函数不记得了, 我需要复习~~~