首頁 後端開發 Python教學 用Pdb庫調試Python的方式及常用的指令

用Pdb庫調試Python的方式及常用的指令

Feb 25, 2017 am 11:00 AM

大家都知道Python是自備Pdb庫,使用Pdb調試Python程式還是很方便的。但是遠端調試、多線程,Pdb是搞不定的,下面一起來看看用Pdb庫調試Python的方式及常用的指令。

用Pdb調試有多種方式

#使用 Pdb調試 Python的程式的方式主要是下面的三種!下面逐一介紹

命令列加-m參數

#命令列啟動目標程序,加上-m參數,這樣呼叫testPdb.py的話斷點就是程式執行的第一行之前

本文接下來重點講到的實例展示就是使用這種方式進行調試的!

python -m pdb testPdb.py
登入後複製

在python互動環境偵錯

##

>>> import pdb
>>> import testPdb
>>> pdb.run('testPdb.test()')
登入後複製

程式碼中插入一段程式

比較常用的,就是在程式中間插入一段程序,相對於在一般IDE 裡面打上斷點然後啟動debug,不過這種方式是

hardcode

if __name__ == "__main__":
 a = 1
 import pdb
 pdb.set_trace()
 b = 2
 c = a + b
 print(c)
登入後複製

#然後正常運行腳本:

python testPdb.py 到了pdb. set_trace()那裡就會定下來,然後就可以看到調試的提示符(Pdb)了

針對上面的這段小程式的調試情況如下:

準備測試程序

接下來使用上面介紹的第一種方式來調試Python程序,以此來介紹pdb常用的命令,不過在開始之前先準備好測試的程式碼:

testFun.py

這是會被主模組呼叫的子模組,用來測試使用Pdb調試的時候,是不是可以斷點從主模組追蹤進入子模組(後續有說明)

#

#!/usr/bin/python
# -*- coding: utf-8 -*-

def add(a, b):
 return a + b
登入後複製

testPdb.py

這是下面被偵錯的主模組的程式碼

#!/usr/bin/python
# -*- coding: utf-8 -*-

def sub(a, b):
 return a - b

if __name__ == "__main__":

 print ''
 import testFun
 i = 0
 a = 1
 while(i < 100):
  a = testFun.add(a, 1)
  i = i + 1
 print "累加结果:", a
 print ""

 for letter in &#39;Pdb&#39;:
  print "当前字母:", letter
 print ""

 fruits = [&#39;banana&#39;, &#39;apple&#39;, &#39;mango&#39;]
 for fruit in fruits:
  print "当前水果:", fruit
 print ""


 ret = 0
 for num in range(10, 12):
  ret = sub(ret, num)
 print &#39;循环结果:&#39;, ret
 print ""

 d = {&#39;abc&#39;: 123, 123: "abc"}
 for (k,v) in d.items():
  print "当前键值对:", k, &#39;-&#39;, v
 print ""
登入後複製

總結常用的指令

基礎指令

h(elp)指令:會列印目前版本Pdb可用的指令,如果要查詢某個指令,可輸入

h [command] ,例如h l 查看list指令

l(ist)指令:可以列出目前將要執行的程式碼區塊

斷點管理

b(reak):設定斷點

例如b 12 就是在目前腳本的第9行加上斷點

例如b sub 是在目前腳本的sub函數定義處加斷點

除了可以在目前的腳本中加入斷點之外,還可以在目前腳本對其他腳本下斷點,以上面用到的程式碼為例

b testFun.add 就可以實作在testFun.py腳本中的add函數加斷點

如果只用b 就會顯示現有的全部斷點

condition bpnumber [condition]:設定條件斷點,例如condition 2 a==0 ,就是在第二個斷點出加條件「a== 0”

cl(ear):刪除斷點,如果後面有參數,就是清楚指定的斷點;如果不帶參數就是清除所有的斷點

disable/enable:停用/啟動斷點

程式邏輯控制

下面展示的幾個指令,需要知道對應的腳本的程式碼和行號,所以這裡先截圖展示下面測試需要用到的前幾行程式碼

c(ont(inue)),讓程式正常運行,直到遇到下一個斷點

n(ext),讓程式運行下一行,如果當前語句有一個函數調用,用n是不會進入被調用的函數體中的

#下圖中展示的,當對腳本斷點調試到

testFun.當add(a, 1)時,繼續執行n,並不會進入testFun.add(a, 1)的函數內部

s(tep),跟n相似,但如果目前有函數調用,那麼s會進入被調用的函數體中

下圖中展示的,當對腳本斷點調試到

testFun.add(a, 1)時,繼續執行s,會進入testFun.add(a, 1)對應的函數定義內部,雖然testFun.add不是本腳本定義的函數

j(ump),讓程式跳到指定的行數

假如目前所在行是10,注意:假如執行了j 20 之後,那麼相當於程式直接跳到20行,中間的11~19行其實就直接跳過去根本沒有被執行到,所以如果這段程式碼中有變數的宣告或物件的初始化需要在20行及之後被用到,那麼等到用到的時候就可能導致報錯!

列印重要資訊

a(rgs),列印目前函數的參數。例如下圖就是展示斷點進入到

testFun.add內部之後,列印 testFun.add的參數

p,列印某個變數

退出偵錯

q,直接退出偵錯;或使用Ctrl+D的方式退出

總結

上面展示的使用 Pdb調試的過程其實是很簡單的,文章中主要透過截圖展示運行的效果。如果單純的看一遍文章,不出意外,會很沒有頭緒,甚至感覺截圖中的命令、輸出亂七八糟,但是如果親自動手跟著走一遍流程,花不了一小時,但是效果絕對極佳!多說一句,Python的調試器是 Pdb,可以對應學習 Linux下 C的調試器 gdb,以上就是本文全部內容,希望對大家學習與工作能有所幫助。

更多用Pdb庫調試Python的方式及常用的指令相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何解決Linux終端中查看Python版本時遇到的權限問題? 如何解決Linux終端中查看Python版本時遇到的權限問題? Apr 01, 2025 pm 05:09 PM

Linux終端中查看Python版本時遇到權限問題的解決方法當你在Linux終端中嘗試查看Python的版本時,輸入python...

在Python中如何高效地將一個DataFrame的整列複製到另一個結構不同的DataFrame中? 在Python中如何高效地將一個DataFrame的整列複製到另一個結構不同的DataFrame中? Apr 01, 2025 pm 11:15 PM

在使用Python的pandas庫時,如何在兩個結構不同的DataFrame之間進行整列複製是一個常見的問題。假設我們有兩個Dat...

如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎? 如何在10小時內通過項目和問題驅動的方式教計算機小白編程基礎? Apr 02, 2025 am 07:18 AM

如何在10小時內教計算機小白編程基礎?如果你只有10個小時來教計算機小白一些編程知識,你會選擇教些什麼�...

如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到? 如何在使用 Fiddler Everywhere 進行中間人讀取時避免被瀏覽器檢測到? Apr 02, 2025 am 07:15 AM

使用FiddlerEverywhere進行中間人讀取時如何避免被檢測到當你使用FiddlerEverywhere...

Uvicorn是如何在沒有serve_forever()的情況下持續監聽HTTP請求的? Uvicorn是如何在沒有serve_forever()的情況下持續監聽HTTP請求的? Apr 01, 2025 pm 10:51 PM

Uvicorn是如何持續監聽HTTP請求的? Uvicorn是一個基於ASGI的輕量級Web服務器,其核心功能之一便是監聽HTTP請求並進�...

Python中如何通過字符串動態創建對象並調用其方法? Python中如何通過字符串動態創建對象並調用其方法? Apr 01, 2025 pm 11:18 PM

在Python中,如何通過字符串動態創建對象並調用其方法?這是一個常見的編程需求,尤其在需要根據配置或運行...

哪些流行的Python庫及其用途? 哪些流行的Python庫及其用途? Mar 21, 2025 pm 06:46 PM

本文討論了諸如Numpy,Pandas,Matplotlib,Scikit-Learn,Tensorflow,Tensorflow,Django,Blask和請求等流行的Python庫,並詳細介紹了它們在科學計算,數據分析,可視化,機器學習,網絡開發和H中的用途

什麼是正則表達式? 什麼是正則表達式? Mar 20, 2025 pm 06:25 PM

正則表達式是在編程中進行模式匹配和文本操作的強大工具,從而提高了各種應用程序的文本處理效率。

See all articles