Python Cookbook(第3版)中文版:14.12 调试基本的程序崩溃错误

14.12 调试基本的程序崩溃错误?

问题?

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

解决方案?

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

艾伯特(http://www.aibbt.com/)国内第一家人工智能门户

原文地址:https://www.cnblogs.com/5rjscn/p/8542846.html

时间: 2024-10-20 19:43:48

Python Cookbook(第3版)中文版:14.12 调试基本的程序崩溃错误的相关文章

Python Cookbook(第3版) 中文版 pdf完整版高清下载

Python Cookbook(第3版)中文版介绍了Python应用在各个领域中的一些使用技巧和方法,其主题涵盖了数据结构和算法,字符串和文本,数字.日期和时间,迭代器和生成器,文件和I/O,数据编码与处理,函数,类与对象,元编程,模块和包,网络和Web编程,并发,实用脚本和系统管理,测试.调试以及异常,C语言扩展等. 本书覆盖了Python应用中的很多常见问题,并提出了通用的解决方案.书中包含了大量实用的编程技巧和示例代码,并在Python 3.3环境下进行了测试,可以很方便地应用到实际项目中

Python Cookbook(第3版)中文版:14.11 输出警告信息

14.11 输出警告信息? 问题? 你希望自己的程序能生成警告信息(比如废弃特性或使用问题). 解决方案? 要输出一个警告消息,可使用 warning.warn() 函数.例如: import warnings def func(x, y, logfile=None, debug=False): if logfile is not None: warnings.warn('logfile argument deprecated', DeprecationWarning) ... warn() 的

Python Cookbook(第3版)中文版:15.12 将函数指针转换为可调用对象

15.12 将函数指针转换为可调用对象? 问题? 你已经获得了一个被编译函数的内存地址,想将它转换成一个Python可调用对象,这样的话你就可以将它作为一个扩展函数使用了. 解决方案? ctypes 模块可被用来创建包装任意内存地址的Python可调用对象.下面的例子演示了怎样获取C函数的原始.底层地址,以及如何将其转换为一个可调用对象: >>> import ctypes >>> lib = ctypes.cdll.LoadLibrary(None) >>

Python Cookbook(第3版)中文版:15.11 用Cython写高性能的数组操作

15.11 用Cython写高性能的数组操作? 问题? 你要写高性能的操作来自NumPy之类的数组计算函数.你已经知道了Cython这样的工具会让它变得简单,但是并不确定该怎样去做. 解决方案? 作为一个例子,下面的代码演示了一个Cython函数,用来修整一个简单的一维双精度浮点数数组中元素的值. # sample.pyx (Cython) cimport cython @cython.boundscheck(False) @cython.wraparound(False) cpdef clip

Python Cookbook(第3版)中文版:15.13 传递NULL结尾的字符串给C函数库

15.13 传递NULL结尾的字符串给C函数库? 问题? 你要写一个扩展模块,需要传递一个NULL结尾的字符串给C函数库.不过,你不是很确定怎样使用Python的Unicode字符串去实现它. 解决方案? 许多C函数库包含一些操作NULL结尾的字符串,被声明类型为 char * .考虑如下的C函数,我们用来做演示和测试用的: void print_chars(char *s) { while (*s) { printf("%2x ", (unsigned char) *s); s++;

Python Cookbook(第3版)中文版:15.1 使用ctypes访问C代码

15.1 使用ctypes访问C代码? 问题? 你有一些C函数已经被编译到共享库或DLL中.你希望可以使用纯Python代码调用这些函数,而不用编写额外的C代码或使用第三方扩展工具. 解决方案? 对于需要调用C代码的一些小的问题,通常使用Python标准库中的 ctypes 模块就足够了.要使用 ctypes ,你首先要确保你要访问的C代码已经被编译到和Python解释器兼容(同样的架构.字大小.编译器等)的某个共享库中了.为了进行本节的演示,假设你有一个共享库名字叫 libsample.so 

python书籍推荐:Python Cookbook第三版中文

所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/44/ 来源:python黑洞网 内容简介 <Python Cookbook(第3版)中文版>介绍了Python应用在各个领域中的一些使用技巧和方法,其主题涵盖了数据结构和算法,字符串和文本,数字.日期和时间,迭代器和生成器,文件和I/O,数据编码与处理,函数,类与对象,元编程,模块和包,网络和Web编程,并发,实用脚本和系统管理,测

python cookbook第三版学习笔记五:datetime

Python中表示时间的模块是datetime,引入下面的模块 from datetime import datetime,timedelta print datetime.today()  #打印出当前的时间 E:\python2.7.11\python.exe E:/py_prj/python_cookbook.py 2017-04-26 21:58:05.663000 我们还可以对时间进行加减操作.这里要用到timedelta模块 这个模块有5个重要参数分别是days,minutes,se

python cookbook第三版学习笔记二:字典

一般来说字典中是一个键对应一个单值的映射,如果想一个键值映射多个值,那么就需要将这些值放到另外的容器中,比如列表或者集合. 比如d={'a':[1,2]} Collections中的defaultdict模块会自动创建这样的字典.如下 d=defaultdict(list) d['a'].append(1) d['a'].append(2) d['b'].append(3) defaultdict(<type 'list'>, {'a': [1, 2], 'b': [3]}) 下面再来看下字典