Python 如何调试程序崩溃错误

问题

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

解决方案

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

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

(0)

相关推荐

  • 使用pdb模块调试Python程序实例

    在Python中,语法错误可以被Python解释器发现,但逻辑上错误或变量使用错误却不容易发现,如果结果没有符合预期,则需要调试,一个很好的调试工具:Python自带的pdb模块.pdb是Python自带的调试模块.使用pdb模块可以为脚本设置断点.单步执行.查看变量值等. pdb可以用命令行参数的方式启动,也可以使用import 将其导入后再使用. 复制代码 代码如下: >>> dir(pdb)  ['Pdb', 'Repr', 'Restart', 'TESTCMD',.....,'

  • Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)

    假设我们有一段程序,从 Redis 中读取数据,解析以后提取出里面的 name 字段: import json import redis client = redis.Redis() def read(): while True: data = client.lpop('info') if data: yield json.loads(data) else: break def parse(): for data in self.read(): print(data['name']) if __

  • 对python程序内存泄漏调试的记录

    问题描述 调试python程序时,用下面这段代码,可以获得进程占用系统内存值.程序跑一段时间后,就能画出进程对内存的占用情况. def memory_usage_psutil(): # return the memory usage in MB import psutil,os process = psutil.Process(os.getpid()) mem = process.memory_info()[0] / float(2 ** 20) return mem 发现进程的内存占用一直再上

  • 调试Python程序代码的几种方法总结

    程序能一次写完并正常运行的概率很小,基本不超过1%.总会有各种各样的bug需要修正.有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug. 第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看: # err.py def foo(s): n = int(s) print '>>> n = %d' % n return 10 / n def main(): f

  • 如何使用repr调试python程序

    一般调试程序的时候都比较倾向print,利用直接打印的方法作出判断,但是print只能打印出结果,对类型无法作出判断.例如: 复制代码 a = 5 b = '5' print(a) print(b) 结果为: 5 5 复制代码 对于a和b从表面看是一样的,可能就会默认为a == b 实则a为int类型,b为string类型 再用repr看看结果: 复制代码 a = 5 b = '5' print(repr(a)) print(repr(b)) 结果为: 5 '5' 复制代码 对于动态的pytho

  • 解决pycharm的Python console不能调试当前程序的问题

    使用python时,程序能运行,但是不能调试,找了半天解决方法,最后此操作分分钟奏效. 两种方法: 方法一:选中要运行的代码,右键Execute Selection in Console(Alt + Shift + E). 方法二:菜单栏--Run--Edit Configuration--勾选Show command line afterwards. 以上这篇解决pycharm的Python console不能调试当前程序的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多

  • 使用PDB简单调试Python程序简明指南

    在 Python 中也可以像 gcc/gdb 那样调试程序,只要在运行 Python 程序时引入 pdb 模块(假设要调试的程序名为 d.py): 复制代码 代码如下: $ vi d.py #!/usr/bin/python def main():         i, sum = 1, 0         for i in xrange(100):                 sum = sum + i         print sum if __name__ == '__main__'

  • 利用Pycharm断点调试Python程序的方法

    1.代码 准备没有语法错误的Python程序: #!/usr/bin/python import numpy as np class Network: def __init__(self,sizes): self.num_layers=len(sizes) self.sizes=sizes self.biases=[np.random.randn(y,1) for y in sizes[1:]] self.weights=[np.random.randn(x,y) \ for x,y in zi

  • 用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试

    MapReduce与HDFS简介 什么是Hadoop? Google为自己的业务需要提出了编程模型MapReduce和分布式文件系统Google File System,并发布了相关论文(可在Google Research的网站上获得: GFS . MapReduce). Doug Cutting和Mike Cafarella在开发搜索引擎Nutch时对这两篇论文做了自己的实现,即同名的MapReduce和HDFS,合起来就是Hadoop. MapReduce的Data flow如下图,原始数据

  • Python 如何调试程序崩溃错误

    问题 你的程序崩溃后该怎样去调试它? 解决方案 如果你的程序因为某个异常而崩溃,运行 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 Trace

  • apache部署python程序出现503错误的解决方法

    前言 本文主要给大家介绍了解决apahce部署python程序出现503错误的相关内容,下面话不多说了,下一起看看详细的介绍吧. 发现问题 今天更新服务器后,发现使用apache部署的某个python程序无法访问了,返回503错误,报错日志如下: [Thu Apr 13 10:54:40 2017] [error] [client 127.0.0.1] (13)Permission denied: mod_wsgi (pid=1814): Unable to connect to WSGI da

  • python使用super()出现错误解决办法

    python使用super()出现错误解决办法 当我们在python的子类中调用父类的方法时,会用到super(),不过我遇到了一个问题,顺便记录一下. 比如,我写了如下错误代码: class A(): def dosomething(self): print "It's A" class B(A): def dosomething(self): super(B, self).dosomething() if __name__ == '__main__': b = B() b.doso

  • 浅谈python连续赋值可能引发的错误

    今天写的代码片段: X = Y = [] .. X.append(x) Y.append(y) 其中x和y是读取的每一个数据的xy值,打算将其归入列表之后绘散点图,但是绘图出来却是一条直线,数据本身并不是这样分布的. 反复检查后,发现是X = Y =[]这一句的错误. 在python中,形如X = Y的拷贝都是浅拷贝,X和Y是公用同一块空间的,一旦对它们其中的任意一个进行数据操作,都会改变该空间的内容,除非重新赋一块空间,改变其指向的位置. 因此只需要改成: X = [] Y = [] 就可以运

  • Python UnboundLocalError和NameError错误根源案例解析

    如果代码风格相对而言不是那么的pythonic,或许很少碰到这类错误.当然并不是不鼓励使用一些python语言的技巧.如果遇到这这种类型的错误,说明我们对python中变量引用相关部分有不当的认识和理解.而这又是对理解python相关概念比较重要的.这也是本文写作的原因. 本文为理解闭包相关概念的做铺垫,后续会详细深入的整理出闭包相关的博文,敬请关注. 1.案例分析 在整理闭包相关概念的过程中,经常发现UnboundLocalError和NameError这两个错误,刚开始遇到的时候可能很困惑,

  • 解决python多行注释引发缩进错误的问题

    如下所示: m_start =date +' 09:00' m_end =date +' 13:00' rsv_1 ={ 'act':'set_resv', 'dev_id':dev_id, 'start':m_start, 'end':m_end, } ''' rsv_2 ={ '_':'', 'act':'set_resv', 'dev_id':dev_id, 'start':'2018-05-21 13:00', 'end_time':'', 'kind_id':'', 'lab_id':

  • 使用Python将Exception异常错误堆栈信息写入日志文件

    假设需要把发生异常错误的信息写入到log.txt日志文件中去: import traceback import logging logging.basicConfig(filename='log.txt', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s') try: raise Exception('发生异常错误信息') except: #方案一,自己定义一个文件,自己把错误堆栈信息写入文件. #er

  • vscode写python时的代码错误提醒和自动格式化的方法

    python的代码错误检查通常用pep8.pylint和flake8,自动格式化代码通常用autopep8.yapf.black.这些工具均可以利用pip进行安装,这里介绍传统的利用pip.exe安装和在VScode中安装两种方式. [温馨提醒] 要使用flake8或要想flake8等工具起作用,前提是必须把settings.json文件中的"python.linting.enabled"值设为"true",否则即使安装了这些工具,也起不到代码的错误提醒. [传统安

  • python怎么自定义捕获错误

    异常捕捉: try: XXXXX1 raise Exception("xxxxx2") except (Exception1,Exception2,--): xxxx3 else: xxxxx4 finally: xxxxxxx5 1.raise 语句可以自定义报错信息,如上. 2. raise后的语句是不会被执行了,因为已经抛出异常,控制流将会跳到异常捕捉模块. 3. except 语句可以一个except后带多个异常,也可以用多个语句捕捉多个异常,分别做不同处理. 4. excep

  • Python常遇到的错误和异常

    目录 1.语法错误 2.异常 3.异常处理 4.try/except...else 5.try-finally 语句 6.抛出异常 7.用户自定义异常 在日常的学习Python过程中,由于本身的编程水平受限,时不时的给我抛出一个异常让我真的很难受:在学习的过程中发现Python中的错误分为语法错误和异常两种. 1.语法错误 Python中的语法错误通常是最为明显的错误了,由于不按照要求书写代码,往往就容易出现语法错误 示例代码: >>> print("hello world)

随机推荐