偵錯執行緒應用程式


在本章中,我們將學習如何偵錯執行緒應用程式。也將學習偵錯的重要性。

偵錯是什麼?

在計算機程式設計中,偵錯是查詢和消除計算機程式中的錯誤,錯誤和異常的過程。 這個過程在程式碼被寫入後立即開始,並且隨著程式碼與其他程式設計單元組合以形成軟體產品而連續進行。 偵錯是軟體測試過程的一部分,是整個軟體開發生命週期的一個組成部分。

Python偵錯器

Python偵錯器(也叫pdb)是Python標準庫的一部分。 這是一個很好的回退工具,用於追蹤難以發現的錯誤,並允許我們快速可靠地修復錯誤的程式碼。 以下是 pdp 偵錯器的兩個最重要的任務 -

  • 它允許在執行時檢查變數的值。
  • 可以遍歷程式碼並設定斷點。

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

  • 通過命令列; 這也被稱為事後偵錯。
  • 通過互動式執行pdb

使用pdb

要使用Python偵錯器,在想要進入偵錯器的位置使用以下程式碼 -

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偵錯器的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偵錯器時,我們可以通過使用以下幾行來在指令碼中的任何位置設定斷點 -

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)