如果没有 IDE,该如何 Debug?

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

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

1、print

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

2、assert

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

21981ac7bab2cbe4bcfa8ccd002018a9.png

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)<module>()
-> for i in range(10000):
(Pdb) i
800
(Pdb) n
> /Users/aaronbrant/test.py(4)<module>()
-> print(i)
(Pdb) n
801
> /Users/aaronbrant/test.py(5)<module>()
-> 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 <topic>):
========================================
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

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值