调试:如何检查我的Python程序卡在哪里?
我写了一个比较大的Python程序,它可以运行,但有时候在运行了几分钟或几个小时后,会在一个不容易重现的时刻卡住,屏幕上什么也不输出。
我不知道它在那个时候在做什么,也不知道代码的哪个部分出了问题。
我该如何在调试器中运行这个程序,或者用其他方法查看它在卡住时正在执行哪些代码行呢?
程序太大了,没法到处加“print”语句。
我试过:
python -m trace --trace /usr/local/bin/my_program.py
但这样输出的信息太多,我根本看不清楚,只看到成千上万行在屏幕上滚动。
最好的办法是,如果我能用“kill -SIGUSR1”之类的命令给程序发送一个信号,然后程序就能进入调试模式,告诉我它停在哪一行,并且可能让我逐步执行程序。
我试过:
pdb usr/local/bin/my_program.py
然后:
(Pdb) cont
但我该怎么做才能看到程序卡住时的位置呢?它没有抛出异常,只是看起来在等待什么,可能是在无限循环中。
还有一个细节:当程序卡住时,我按下^C,然后(不确定这是否必要)程序就会正常继续运行(没有抛出任何异常,也没有给我任何提示说明为什么停下来了)。
3 个回答
0
没有哪个程序是太大而不能到处加打印语句的。你需要了解一下 logging
模块,并插入很多 logging.debug()
语句。这其实是一种比普通打印语句更好的方式,它可以把信息输出到一个文件里,而且在正式的软件中可以很方便地关闭。不过,几年后当你需要修改代码时,你可以轻松地把这些信息打开,这样就能得到原来程序员的思路和见解。
0
你可以试着在像pydev(eclipse)或pycharm这样的开发环境中以调试模式运行它。这样你可以在任何时候暂停程序,查看它当前正在执行到哪一步。
5
这可能对你有帮助。 我通常会这样做。
>>> import pdb
>>> import program2debug
>>> pdb.run('program2debug.test()')
我通常会在我的程序中加一个 -v
选项,这样可以开启很多打印语句,详细解释我在做什么。当你将来写程序的时候,可以考虑在程序变得很大之前就这样做,这样会更容易理解。