鍍金池/ 教程/ Python/ 調(diào)試線程應(yīng)用程序
事件驅(qū)動(dòng)程序
反應(yīng)式編程
進(jìn)程池
線程
線程池
Python并發(fā)簡介
并發(fā)vs并行
同步線程
調(diào)試線程應(yīng)用程序
進(jìn)程間通信
線程通信
Python并發(fā)編程教程
測(cè)試線程應(yīng)用程序
基準(zhǔn)和性能分析
系統(tǒng)和內(nèi)存架構(gòu)
線程的實(shí)現(xiàn)
多進(jìn)程

調(diào)試線程應(yīng)用程序

在本章中,我們將學(xué)習(xí)如何調(diào)試線程應(yīng)用程序。也將學(xué)習(xí)調(diào)試的重要性。

調(diào)試是什么?

在計(jì)算機(jī)編程中,調(diào)試是查找和消除計(jì)算機(jī)程序中的錯(cuò)誤,錯(cuò)誤和異常的過程。 這個(gè)過程在代碼被寫入后立即開始,并且隨著代碼與其他編程單元組合以形成軟件產(chǎn)品而連續(xù)進(jìn)行。 調(diào)試是軟件測(cè)試過程的一部分,是整個(gè)軟件開發(fā)生命周期的一個(gè)組成部分。

Python調(diào)試器

Python調(diào)試器(也叫pdb)是Python標(biāo)準(zhǔn)庫的一部分。 這是一個(gè)很好的回退工具,用于追蹤難以發(fā)現(xiàn)的錯(cuò)誤,并允許我們快速可靠地修復(fù)錯(cuò)誤的代碼。 以下是 pdp 調(diào)試器的兩個(gè)最重要的任務(wù) -

  • 它允許在運(yùn)行時(shí)檢查變量的值。
  • 可以遍歷代碼并設(shè)置斷點(diǎn)。

我們可以通過以下兩種方式使用pdb:

  • 通過命令行; 這也被稱為事后調(diào)試。
  • 通過交互式運(yùn)行pdb

使用pdb

要使用Python調(diào)試器,在想要進(jìn)入調(diào)試器的位置使用以下代碼 -

import pdb;
pdb.set_trace()

考慮以下命令通過命令行使用pdb。

  • h(help)
  • d(down)
  • u(up)
  • b(break)
  • cl(clear)
  • l(list))
  • n(next))
  • c(continue)
  • s(step)
  • r(return))
  • b(break)

以下是Python調(diào)試器的h(幫助)命令演示 -

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調(diào)試器時(shí),我們可以通過使用以下幾行來在腳本中的任何位置設(shè)置斷點(diǎn) -

import pdb;
pdb.set_trace()

設(shè)置斷點(diǎn)后,我們可以正常運(yùn)行腳本。 該腳本將執(zhí)行到某個(gè)斷點(diǎn); 直到設(shè)置了一行。 考慮以下示例,我們將通過在腳本中的各個(gè)位置使用上述行來運(yùn)行腳本 -

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

當(dāng)上面的腳本運(yùn)行時(shí),它會(huì)執(zhí)行程序直到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'。 隨后出現(xiàn)錯(cuò)誤,因?yàn)槲覀円褜帱c(diǎn)設(shè)置為a ="aaa"。

同樣,我們可以通過更改斷點(diǎn)并查看輸出中的差異來運(yùn)行腳本 -

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

執(zhí)行上面示例代碼,得到以下結(jié)果 -

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

在下面的腳本中,在程序的最后一行設(shè)置斷點(diǎn) -

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

執(zhí)行上面代碼,輸出結(jié)果如下 -

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