除錯執行緒應用程式



本章我們將學習如何除錯執行緒應用程式。我們還將學習除錯的重要性。

什麼是除錯?

在計算機程式設計中,除錯是查詢和移除計算機程式中錯誤、異常和問題的過程。這個過程從程式碼編寫之初就開始了,並在後續階段繼續進行,將程式碼與其他程式設計單元組合以形成軟體產品。除錯是軟體測試過程的一部分,也是整個軟體開發生命週期中不可或缺的一部分。

Python 偵錯程式

Python 偵錯程式或pdb是 Python 標準庫的一部分。它是一個查詢難以發現的錯誤的良好後備工具,允許我們快速可靠地修復有故障的程式碼。以下是pdb 偵錯程式的兩個最重要的任務:

  • 它允許我們在執行時檢查變數的值。
  • 我們也可以單步執行程式碼並設定斷點。

我們可以透過以下兩種方式使用 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(help) 命令的演示:

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)
廣告
© . All rights reserved.