问题

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

解决方案

如果你的程序因为某个异常而崩溃,运行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

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)()

-> 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 "", line 1, in

File "", line 3, in sample

File "", line 3, in sample

File "", line 3, in sample

File "", line 3, in sample

File "", line 3, in sample

File "", 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手册。

以上就是Python 如何调试程序崩溃错误的详细内容,更多关于Python调试程序崩溃错误的资料请关注python博客其它相关文章!

python在运行调试程序时常出现的错误有_Python 如何调试程序崩溃错误相关推荐

  1. python shell运行当前程序、可以按下_Python下调用Linux的Shell命令的方法

    有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...

  2. python语法错误怎么办_Python给出语法错误但没有错误?

    有人能解释一下python为什么不允许这样做吗?在# -*- coding: utf-8 -* import win32api,win32con,os,time,sys x_pad =464 y_pa ...

  3. python运行错误-Python在运行中发生错误怎么正确处理方法,案例详解!

    在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返回文件描 ...

  4. python exe运行报 编码错误_python运行显示编码错误

    python中运行显示编码错误一般有2种原因: 编码与译码的方式不一致 在编写Python时,当使用中文输出或注释时运行脚本,会提示错误信息: SyntaxError: Non-ASCII chara ...

  5. python语法错误修改_python基础之错误、调试(异常处理)

    在程序运行过程中,总会遇到各种各样的错误. 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的. 有的错误是用户输入造成的,比如让用 ...

  6. Python|Python简介|安装Python解释器|运行|开发工具|Python之禅|turtle绘制五星红旗|绘制方块|绘制小猪佩奇|语言100课:学习(1)

    文章目录 源项目地址 初识Python Python简介 Python的历史 Python的优缺点 Python的应用领域 安装Python解释器 运行Python程序 确认Python的版本 编写P ...

  7. python从外部传入参数_从另一个Python脚本运行一个Python脚本,并传入参数 - python...

    我想从另一个Python脚本运行一个Python脚本.我想像使用命令行一样传递变量. 例如,我将运行我的第一个脚本,该脚本将遍历值列表(0.1.2.3),并将其传递给第二个脚本,依次为script2. ...

  8. python返回错误提示_python 错误处理

    在程序运行的过程中,如果发生了错误,可以事先约定返回一个错误代码,这样,就可以知道是否有错,以及出错的原因.在操作系统提供的调用中,返回错误码非常常见.比如打开文件的函数open(),成功时返回文件描 ...

  9. python解释器运行代码-Python如何运行程序

    人生苦短,我用Python. 作为一个开发人员,如何写代码是必须要知道的,代码如何运行也是有必要了解的.通过了解代码如何运行,可指导我们写出效率更高的代码.下午看了<Python学习手册> ...

最新文章

  1. scanf 接收 空格 输入_你需要知道的scanf函数用法
  2. 真香!3个月0基础转型大厂数据分析师,他做对了什么?
  3. oracle convertobject,oracle.sql進行轉換。TIMESTAMPLTZ@71d9d55b Java時間戳
  4. jQuery里面的datepicker日期控件默认是显示英文的,如何显示中文或其他语言呢?...
  5. 公司--》字符串截取
  6. 电流环差分信号传送数字信号
  7. 浅析网站优化中锚文本的使用技巧
  8. 数据结构实验之栈与队列九:行编辑器
  9. observable_在Completablefuture和Observable之间转换
  10. 改善深层神经网络:超参数调整、正则化以及优化——2.5 指数加权平均的偏差修正
  11. ubuntu 发数据给usb_【奇怪的知识】USB 镜像刻录知识点
  12. CF-1156F Card Bag
  13. jlink6.80a烧写序列号(serial number)问题记录
  14. js实现图片放大镜效果——简单方法
  15. UINO优锘:深度|扒一扒图化资源申请之三生三世那点事儿
  16. WebStorm调试
  17. barrier()函数
  18. 最新5G时代投资区块链源码全修复版+对接免签支付+搭建视频
  19. SOI round0 题解
  20. windows下安装PGSQL14

热门文章

  1. 每日一皮:传说中的三次握手...
  2. 从零开始入门 K8s | K8s 的应用编排与管理
  3. JDK 13 的五大新特性!你最中意哪个?
  4. Spring Cloud构建微服务架构:分布式配置中心(加密解密)
  5. python 权限管理 mongodb_MongoDB为用户设置访问权限
  6. ByteTrack 多目标跟踪 测试笔记
  7. python 局域网共享
  8. pytorch bceloss测试
  9. 逻辑回归原理(python代码实现)
  10. android 找不到符号 符号 RequiresApi