科探空谷
  • Home
  • zhimind home
  • Categories
  • Tags
  • Archives
  • 留学
    • 学校库
    • 专业库
    • 研究方向与招生
    • 工具
    • GPA计算器
    • 脑洞背单词
    • 脱口而出

交互式调试器-第一部分

目录

  • 调试器
    • 主要功能
  • 如何实现
  • sys.setrace()
    • traceit
目录

调试器¶

调试课第一单元的编程练习,就是建一个蟒蛇版的蜘蛛网,Sorry,是Python版的捉虫调试器。

建一个简单的、交互式的调试器,来帮助我们捉虫,既然要诚心诚意地建这么个工具,我们就在发慈悲地给它起个名字——spyder,simple python debugger,一语N关,此名得之。

spyder调试器是个命令行调试器,想到gdb了是吧?当然没法跟人家比了,哪怕是自家孩子,咱们也要有自知之明嘛。如果你愿意给它打扮一下,武装到牙齿,上装备(gui)的话,就可以变成图形界面调试器了。无聊的话,每次调试还可以配个蜘蛛爬的动画……

主要功能¶

  1. 交互式调试
  2. 增加断点(break)
  3. 恢复执行(run)、
  4. 输出(print)等等

后面还会再补充其他的。

如何实现¶

这样一个调试器的实现,最重要的当然还是如何使得程序的执行听从指挥,而不是默认的嗯一撸到底。就像Linux下的c语言有ptrace函数一样(我没用过),python同样有自己的骄傲,sys模块里的settrace函数可以助我们一臂之力。

sys.setrace()¶

sys.settrace(trace_function) 函数可以设置全局调试跟踪函数,在参数trace_function每次调用时,它也会被调用到,而与之搭档的function (此处起名traceit)也有一定的模式

traceit就相当于一个回调callback函数, Python代码在每执行一行后,就会调用这个函 数, 所以会给这个函数传相应的程序信息, 归类如下:

  1. 文件相关
    • 行数
    • 文件名
    • 变量列表
    • 应该还有函数名?
  2. 事件
    • 执行某一行 line
    • 调用函数 call
    • 返回 return
    • 异常 exception
    • 等等
  3. 外界参数

所以,我们设计的 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

因为太久了, 已经忘记内容了~~~还算清楚,但也解释下

  1. stepping是 单步调试标志
  2. 对比当前事件 event
  3. breakpoints 显然就是断点集合了, 格式是 {文件名+行号: T/F}
  4. debug 函数不记得了, 我需要复习~~~

Published

4月 15, 2017

Last Updated

4月 18, 2017

Category

软件开发

Tags

  • 调试 5
  • Python 15
  • 软件开发 6

Stay in Touch

  • Powered by Pelican. Theme: Elegant by Talha Mansoor