zoukankan      html  css  js  c++  java
  • 超详细讲解如何使用 pdb 在服务器上调试代码

    Pycharm 的图形化界面虽然好用,但是在某些场景中,是无法使用的。而 Python 本身已经给我们提供了一个调试神器 -- pdb,可能你还不知道它,为了讲解这个神器,我写了这篇文章来帮助你轻松的理解它。

    1. 准备文件

    在调试之前先将这两个文件准备好(做为演示用),并放在同级目录中。

    utils.py

    def sum(mylist):
        result = 0
        for item in mylist:
            result += item
        return result
    

    pdb_demo.py

    import utils
    
    def myfunc(mylist):
        result = utils.sum(mylist)
        print(result)
    
    
    if __name__ == '__main__':
        print("----start----")
        myfunc([1,2,3,4])
        print("----end-----")
    

    2. 进入调试模式

    主要有两种方法

    做为脚本调用,方法很简单,就像正常执行python脚本一样,只是多加了-m pdb

    ptyhon -m pdb pdb_demo.py
    

    使用这个方式进入调试模式,会在脚本的第一行开始单步调试。

    对于单文件的脚本并没有什么问题,如果是一个大型的项目,项目里有很多的文件,使用这种方式只能大大降低我们的效率。

    一般情况下,都会直接在你需要的地方打一个断点,那如何打呢?

    只需在你想要打断点的地方加上这两行。

    import pdb
    pdb.set_trace()
    

    然后执行时,也不需要再指定-m pdb了,直接python pdb_demo.py ,就会直接在这个地方暂停。

    3. 调试指令

    熟悉 Pycharm 的人都知道,我们执行下一步,执行到下一个断点是

    同样的,pdb 也需要你更多记这样的命令。

    当你看到pdb模式的标识符 (Pdb)时,就可以输入这样的命令。

    我在这里将这些指令按使用频度分为三个等级。

    最常用

    指令 英文 解释
    n Next 下一步
    l list 列出当前断点处源码
    p print 打印变量
    s step into 执行当前行,可以进入函数
    r return 运行完当前函数,返回结果
    c continue 执行到下一断点或者结束
    b break 设置断点
    q quit 退出程序

    有时使用

    指令 英文 解释
    a args 列出当前函数的参数
    pp pprint 一种可视化更好的打印
    j jump 跳到指定行
    cl clear 清除断点
    w where 打印当前堆栈
    u up 执行跳转到当前堆栈的上一层
    unt until 行数递增执行(忽略循环和函数)
    ll longlist 列出更多的源码
    run/restart run 重新启动 debug(-m pdb)

    几乎不用

    指令 英文 解释
    tbreak temporary break 临时断点
    disable 停用断点
    enable 启用断点
    alias 设置别名
    unalias 删除别名
    whatis 打印对象类型
    ignore 设置忽略的断点
    source 列出给定对象的源码

    其上全部是我翻译自官方文档,原文在这里:https://docs.python.org/3/library/pdb.html

    其实你大可不必死记这些命令,忘记的时候,只要敲入help并回车,就可以看所有的指令了。

    4. 开始调试

    这里就几个最常用的指定,来演示一遍。

    这个调试过程,我加了些注释,你应该能够很轻易地理解这种调试方式。

    今天pdb的调试内容大概就是这些,你学会了吗?

    看到上面截图的时间了吧?是的,又是一个深夜写的文章。希望对你会有所帮助。

  • 相关阅读:
    listview 加载性能优化 viewholder
    eclipse使用有感
    android常见的错误
    填充父窗体布局问题
    setTag()/getTag()
    自己动手实现自旋锁
    新手学信息检索6:谈谈二值独立模型
    自己动手编译、运行Java程序
    新手学信息检索5:正确率召回率与搜索引擎的评价
    新手学信息检索4:向量空间模型与相似度计算
  • 原文地址:https://www.cnblogs.com/wongbingming/p/13901152.html
Copyright © 2011-2022 走看看