📜  Python|基本程序崩溃调试

📅  最后修改于: 2022-05-13 01:55:48.387000             🧑  作者: Mango

Python|基本程序崩溃调试

如果程序因异常而崩溃,将程序作为python3 -i运行可能是一个简单的环顾四周的有用工具。 -i选项会在程序终止后立即启动交互式 shell。从那里,可以探索环境。

代码#1:给定代码
# abc.py
def func(n):
    return n + 10
  
func('Hello')

代码 #2:运行 python3 -i 产生以下

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调试器,如下面的代码所示。

代码#3:

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 的环境中(例如,在服务器中),则捕获错误并生成回溯,如下面的代码所示。

代码 #4:

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

如果程序没有崩溃,但它产生了错误的答案或工作错误,那么在感兴趣的地方注入一些print()调用通常没有错。但是,有一些相关的有趣技术。首先, traceback.print_stack()函数将在该点立即创建程序的堆栈跟踪,如下面的代码所示。

代码#5:

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()手动启动程序 cab 中任何点的调试器,如下所示:

代码 #6:

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

这对于探索大型程序的内部结构并回答有关控制流或函数参数的问题可能是一种有用的技术。