Python 如何调试程序崩溃错误

作者:David Beazley 时间:2022-04-27 15:22:30 

问题

你的程序崩溃后该怎样去调试它?

解决方案

如果你的程序因为某个异常而崩溃,运行 python3 -i someprogram.py 可执行简单的调试。 -i 选项可让程序结束后打开一个交互式shell。 然后你就能查看环境,例如,假设你有下面的代码:


# sample.py

def func(n):
return n + 10

func('Hello')

运行 python3 -i sample.py 会有类似如下的输出:


bash % python3 -i sample.py
Traceback (most recent call last):
File "sample.py", line 6, in <module>
func('Hello')
File "sample.py", line 4, in func
return n + 10
TypeError: Can't convert 'int' object to str implicitly
>>> func(10)
20
>>>

如果你看不到上面这样的,可以在程序崩溃后打开Python的调试器。例如:


>>> import pdb
>>> pdb.pm()
> sample.py(4)func()
-> return n + 10
(Pdb) w
sample.py(6)<module>()
-> func('Hello')
> sample.py(4)func()
-> return n + 10
(Pdb) print n
'Hello'
(Pdb) q
>>>

如果你的代码所在的环境很难获取交互shell(比如在某个服务器上面), 通常可以捕获异常后自己打印跟踪信息。例如:


import traceback
import sys

try:
func(arg)
except:
print('**** AN ERROR OCCURRED ****')
traceback.print_exc(file=sys.stderr)

要是你的程序没有崩溃,而只是产生了一些你看不懂的结果, 你在感兴趣的地方插入一下 print() 语句也是个不错的选择。 不过,要是你打算这样做,有一些小技巧可以帮助你。 首先,traceback.print_stack() 函数会你程序运行到那个点的时候创建一个跟踪栈。例如:


>>> def sample(n):
...  if n > 0:
...    sample(n-1)
...  else:
...    traceback.print_stack(file=sys.stderr)
...
>>> sample(5)
File "<stdin>", line 1, in <module>
File "<stdin>", line 3, in sample
File "<stdin>", line 3, in sample
File "<stdin>", line 3, in sample
File "<stdin>", line 3, in sample
File "<stdin>", line 3, in sample
File "<stdin>", line 5, in sample
>>>

另外,你还可以像下面这样使用 pdb.set_trace() 在任何地方手动的启动调试器:


import pdb

def func(arg):
...
pdb.set_trace()
...

当程序比较大而你想调试控制流程以及函数参数的时候这个就比较有用了。 例如,一旦调试器开始运行,你就能够使用 print 来观测变量值或敲击某个命令比如 w 来获取追踪信息。

讨论

不要将调试弄的过于复杂化。一些简单的错误只需要观察程序堆栈信息就能知道了, 实际的错误一般是堆栈的最后一行。 你在开发的时候,也可以在你需要调试的地方插入一下 print() 函数来诊断信息(只需要最后发布的时候删除这些打印语句即可)。

调试器的一个常见用法是观测某个已经崩溃的函数中的变量。 知道怎样在函数崩溃后进入调试器是一个很有用的技能。

当你想解剖一个非常复杂的程序,底层的控制逻辑你不是很清楚的时候, 插入 pdb.set_trace() 这样的语句就很有用了。

实际上,程序会一直运行到碰到 set_trace() 语句位置,然后立马进入调试器。 然后你就可以做更多的事了。

如果你使用IDE来做Python开发,通常IDE都会提供自己的调试器来替代pdb。 更多这方面的信息可以参考你使用的IDE手册。

来源:https://python3-cookbook.readthedocs.io/zh_CN/latest/c14/p12_debugging_basic_program_crashes.html

标签:Python,程序,崩溃,调试
0
投稿

猜你喜欢

  • Access 2007简易入门手册

    2008-12-04 13:12:00
  • python实现的简单抽奖系统实例

    2022-05-11 16:14:05
  • VSCode如何巧用正则表达式快速处理字符段

    2022-06-13 06:44:00
  • oracle sys_connect_by_path 函数 结果集连接

    2009-07-12 18:48:00
  • 从传文件功能看本地化

    2009-12-29 13:03:00
  • python实现TCP服务器端与客户端的方法详解

    2023-05-17 09:39:39
  • 实例讲解python函数式编程

    2022-10-30 22:14:35
  • python实现本地图片转存并重命名的示例代码

    2021-08-01 16:33:46
  • 使用pandas将numpy中的数组数据保存到csv文件的方法

    2023-07-17 15:27:38
  • mysql5.7版本root密码登录问题的解决方法

    2024-01-21 00:47:43
  • python数据处理 根据颜色对图片进行分类的方法

    2022-02-27 08:41:37
  • 利用pandas按日期做分组运算的操作

    2021-03-06 09:16:17
  • php之Aes加密案例讲解

    2023-06-11 12:59:12
  • 使用php get_headers 判断URL是否有效的解决办法

    2023-11-24 00:02:50
  • Python requests的SSL证书验证方式

    2021-10-06 09:21:51
  • 解决MySQL报错:You can‘t specify target table ‘region‘ for update in FROM clause

    2024-01-27 08:02:39
  • 安装PyTorch的详细过程记录

    2023-05-12 07:50:12
  • 原生JS下拉加载插件分享

    2024-04-29 13:42:35
  • Python基于xlrd模块操作Excel的方法示例

    2021-07-18 16:04:06
  • selenium WebDriverWait类等待机制的实现

    2022-12-18 13:07:21
  • asp之家 网络编程 m.aspxhome.com