如果没有 IDE,该如何 Debug?

Python七号

共 2527字,需浏览 6分钟

 ·

2021-11-20 09:25

写代码时噼里啪啦,一顿操作猛如虎,一运行,发现不是 error 就是 exception,这是程序员经常遇到的场景,解决它就需要一步步去排错,排错的这个过程叫做 Debug。


借助 IDE(比如大名鼎鼎的 PyCharm 、VSCode) 本身的调试和跳转功能,你可以轻松定位到问题代码,但在服务器环境下,根本没有 IDE,这种情况下又该如何 Debug?本文分享 4 个没有 IDE 情况下的 Debug 技巧。


1、print


print 可以说非常简单粗暴易懂,觉得哪个变量有问题,直接在终端里面打印出来就看到妖怪的原型了,借助于二分法,可以很快定位到代码的问题。


2、assert


print 有个缺点,你用完还要手动删除,如果你懒得删除,就使用 asser 来断言好了,当你觉得某个变量必须是某值时,就可以加上 assert,如果不是,这里就会抛出异常,这样就定位到了问题。



3、日志 


有时候,我们不方便在终端中查看信息,尤其是多线程的 Web 应用,此时就可以通过写入日志的方法来 Debug 问题。这个类似于 print,不再多说。


4、pdb


要说真正的 Debug 工具,还要说 Python 自带的 pdb 最为实用,掌握这个,无论什么环境都不影响你 debug。



接下来,我们就一起来看看,pdb 在 Python 中到底应该如何使用。首先,要启动 pdb 调试,我们只需要在程序中,加入“import pdb”和“pdb.set_trace()”这两行代码就行了,比如下面这个简单的例子:


import pdb
for i in range(10000):
    print(i)
    if i == 800:
        pdb.set_trace()


当这个循环进行到 i==800 时,自动停下来进入命令行的调试,输入 i 即可查询变量的值,输入 n 表示执行下一行,输入 ll 查看上下文,输入 help 查看帮助。


......
799
800
> /Users/aaronbrant/test.py(3)()
-> for i in range(10000):
(Pdb) i
800
(Pdb) n
> /Users/aaronbrant/test.py(4)()
-> print(i)
(Pdb) n
801
> /Users/aaronbrant/test.py(5)()
-> if i == 800:
(Pdb) ll
  1      import pdb
  2
  3      for i in range(10000):
  4          print(i)
  5  ->        if i == 800:
  6              pdb.set_trace()
(Pdb) help

Documented commands (type help ):
========================================
EOF    c          d        h         list      q        rv       undisplay
a      cl         debug    help      ll        quit     s        unt
alias  clear      disable  ignore    longlist  r        source   until
args   commands   display  interact  n         restart  step     up
b      condition  down     j         next      return   tbreak   w
break  cont       enable   jump      p         retval   u        whatis
bt     continue   exit     l         pp        run      unalias  where


如果使用 IDE,是否要点击 800 次呢,我不是很清楚,没试过,如果使用 IDE 来断点定位至循环内的 800 次,我会直接放弃,选用其他方式。


除此之外,你也可以不修改代码,直接命令行使用 pdb 来 debug:


python -m pdb 123.py

pdb 其他命令:

  • s 表示 step into,即进入相对应的代码内部。这时,命令行中会显示”--Call--“的字样,当你执行完内部的代码块后,命令行中则会出现”--Return--“的字样。
  • r 表示 step out,即继续执行,直到当前的函数完成返回。
  • b 可以用来设置断点。比方说,我想要在代码中的第 10 行,再加一个断点,那么在 pdb 模式下输入”b 11“即可。
  • c 则表示一直执行程序,直到遇到下一个断点。

当然,除了这些常用命令,还有许多其他的命令可以使用,这里我就不在一一赘述了。你可以参考对应的官方文档(https://docs.python.org/3/library/pdb.html#module-pdb),来熟悉这些用法。


最后的话


本文分享了 4 个不依赖 IDE 的调试技巧,前三个非常简单,最后一个 pdb 学习成本稍高。如果要我选一个的话,我会选择日志这样的方式:将必要的变量及报错的堆栈信息都保存在日志文件中,当我们的程序报错时,所有必要的证据已经收集完毕,不需要再花心思复原现场,对着日志看下代码逻辑就可以更快的发现并解决问题。


如果有收获,还请点赞、关注、转发,感谢阅读。


推荐阅读:

求求你,别用 print 来 debug 了

在Python中正确的使用断言-assert

效率神器-快速定位最慢的代码

浏览 36
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报