调试线程应用程序

在本章中,我们将学习如何调试线程应用程序.我们还将了解调试的重要性.

什么是调试?

在计算机编程中,调试是查找和删除错误的过程,计算机程序的错误和异常.一旦代码被编写就开始该过程,并且当代码与其他编程单元组合以形成软件产品时,该过程在连续阶段中继续.调试是软件测试过程的一部分,是整个软件开发生命周期中不可或缺的一部分.

Python调试器

Python调试器或者 pdb 是Python标准库的一部分.它是一个很好的后备工具,用于跟踪难以发现的错误,并允许我们快速可靠地修复错误的代码.以下是 pdp 调试器的两个最重要的任务 :

  • 它允许我们检查值运行时的变量.

  • 我们也可以单步执行代码并设置断点.

我们可以使用pdb有以下两种方式 :

  • 通过命令行;这也称为postmortem调试.

  • 通过交互式运行pdb.

使用pdb

对于使用Python调试器,我们需要在我们想要进入调试器的地方使用以下代码 :

import pdb;
pdb.set_trace()

考虑以下命令通过命令行使用pdb.

  • h(帮助)

  • d(向下)

  • u(向上)

  • b(休息)

  • cl(清除)

  • l(列表))

  • n(下一个))

  • c(续)

  • s(步骤)

  • r(返回))

  • b(休息)

以下是h(帮助)命令的演示Python调试器 :

import pdb

pdb.set_trace()
--Call--
>d:\programdata\lib\site-packages\ipython\core\displayhook.py(247)__call__()
-> def __call__(self, result = None):
(Pdb) h

Documented commands (type help <topic>):
========================================
EOF   c         d       h        list     q       rv      undisplay
a     cl        debug   help     ll       quit    s       unt
alias clear     disable ignore   longlist r       source  until
args  commands  display interact n        restart step    up
b     condition down    j        next     return  tbreak  w
break cont      enable  jump     p        retval  u       whatis
bt    continue  exit    l        pp       run     unalias where

Miscellaneous help topics:
==========================
exec pdb

示例

使用Python调试器时,我们可以设置断点脚本中的任何位置使用以下行 :

 
 import pdb; 
 pdb.set_trace()

设置断点后,我们可以正常运行脚本.该脚本将执行到某一点;直到设置了一条线.考虑以下示例,我们将在脚本中的各个位置使用上述行来运行脚本 :

import pdb;
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print (final)

当运行上面的脚本时,它将执行程序直到a ="aaa",我们可以在下面的输出中检查这个.

输出

--Return--
> <ipython-input-7-8a7d1b5cc854>(3)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
*** NameError: name 'b' is not defined
(Pdb) p c
*** NameError: name 'c' is not defined

在pdb中使用命令'p(print)'后,脚本只打印'aaa'.之后是错误,因为我们已将断点设置为a ="aaa".

同样,我们可以通过更改断点运行脚本并查看输出和减号的差异;

import pdb
a = "aaa"
b = "bbb"
c = "ccc"
pdb.set_trace()
final = a + b + c
print (final)

输出

--Return--
> <ipython-input-9-a59ef5caf723>(5)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
*** NameError: name 'final' is not defined
(Pdb) exit

在下面的脚本中,我们在程序的最后一行设置断点 :

import pdb
a = "aaa"
b = "bbb"
c = "ccc"
final = a + b + c
pdb.set_trace()
print (final)

输出如下 :

--Return--
> <ipython-input-11-8019b029997d>(6)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
'aaabbbccc'
(Pdb)