如果没有 IDE,该如何 Debug?
共 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 学习成本稍高。如果要我选一个的话,我会选择日志这样的方式:将必要的变量及报错的堆栈信息都保存在日志文件中,当我们的程序报错时,所有必要的证据已经收集完毕,不需要再花心思复原现场,对着日志看下代码逻辑就可以更快的发现并解决问题。
如果有收获,还请点赞、关注、转发,感谢阅读。
推荐阅读: