1. 程式人生 > >我常用的 Python 除錯工具

我常用的 Python 除錯工具

以下是我做除錯或分析時用過的工具的一個概覽。如果你知道有更好的工具,請在評論中留言,可以不用很完整的介紹。

日誌

沒錯,就是日誌。再多強調在你的應用裡保留足量的日誌的重要性也不為過。你應當對重要的內容打日誌。如果你的日誌打的足夠好的話,單看日誌你就能發現問題所在。那樣可以節省你大量的時間。

如果一直以來你都在程式碼裡亂用 print 語句,馬上停下來。換用logging.debug。以後你還可以繼續複用,或是全部停用等等。

跟蹤

有時更好的辦法是看執行了哪些語句。你可以使用一些IDE的偵錯程式的單步執行,但你需要明確知道你在找那些語句,否則整個過程會進行地非常緩慢。
標準庫裡面的trace模組,可以列印執行時包含在其中的模組裡所有執行到的語句。(就像製作一份專案

報告)

Shell
1 python-mtracetrace script.py

這會產生大量輸出(執行到的每一行都會被打印出來,你可能想要用grep過濾那些你感興趣的模組).
比如:

Shell
1 python-mtracetrace script.py|egrep'^(mod1.py|mod2.py)'

偵錯程式

以下是如今應該人盡皆知的一個基礎介紹:

Python
12 importpdbpdb.set_trace()# 開啟pdb提示

或者

12345 try:(一段丟擲異常的程式碼)except:import pdbpdb.pm()# 或者 pdb.post_mortem()

或者(輸入 c 開始執行指令碼)

Shell
1 python-mpdb script.py

在輸入-計算-輸出迴圈(注:REPL,READ-EVAL-PRINT-LOOP的縮寫)環境下,可以有如下操作:

  • c or continue
  • q or quit
  • l or list, 顯示當前步幀的原始碼
  • w or where,回溯呼叫過程
  • d or down, 後退一步幀(注:相當於回滾)
  • u or up, 前進一步幀
  • (回車), 重複上一條指令

其餘的幾乎全部指令(還有很少的其他一些命令除外),在當前步幀上當作python程式碼進行解析。

如果你覺得挑戰性還不夠的話,可以試下smiley,-它可以給你展示那些變數而且你能使用它來遠端追蹤程式。

更好的偵錯程式

pdb的直接替代者:
ipdb(easy_install ipdb) – 類似ipython(有自動完成,顯示顏色等)
pudb(easy_install pudb) – 基於curses(類似圖形介面介面),特別適合瀏覽原始碼

遠端偵錯程式

安裝方式:

Shell
1 sudo apt-getinstall winpdb

用下面的方式取代以前的pdb.set_trace():

Python
12 importrpdb2rpdb2.start_embedded_debugger("secretpassword")

現在執行winpdb,檔案-關聯

不喜歡Winpdb?也可以直接包裝PDB在TCP之上執行!

這樣做:

Python
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 importlogggingclassRdb(pdb.Pdb):"""    This will run pdb as a ephemeral telnet service. Once you connect no one    else can connect. On construction this object will block execution till a    client has connected.    Based on https://github.com/tamentis/rpdb I think ...    To use this::        Rdb(4444).set_trace()    Then run: telnet 127.0.0.1 4444    """def__init__(self,port=0):self.old_stdout=sys.stdoutself.old_stdin=sys.stdinself.listen_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)self.listen_socket.bind(('0.0.0.0',port))ifnotport:logging.critical("PDB remote session open on: %s",self.listen_socket.getsockname())print>>sys.__stderr__,"PDB remote session open on:",self.listen_socket.getsockname()sys.stderr.flush()self.listen_socket.listen(1)self.connected_socket,address=self.listen_socket.accept()self.handle=self.connected_socket.makefile('rw')pdb.Pdb.__init__(self,completekey='tab',stdin=self.handle,stdout=self.handle)sys.stdout=sys.stdin=self.handledefdo_continue(self,arg):sys.stdout=self.old_stdoutsys.stdin=self.old_stdinself.handle.close()self.connected_socket.close()self.listen_socket.close()self.set_continue()return1do_c=do_cont=do_continuedefset_trace():"""    Opens a remote PDB on first available port.    """rdb=Rdb()rdb.set_trace()

只想要一個REPL環境?試試IPython如何?
如果你不需要一個完整齊全的偵錯程式,那就只需要用一下的方式啟動一個IPython即可:

Python
12 importIPythonIPython.embed()

標準linux工具

我常常驚訝於它們竟然遠未被充分利用。你能用這些工具解決很大範圍內的問題:從效能問題(太多的系統呼叫,記憶體分配等等)到死鎖,網路問題,磁碟問題等等。
其中最有用的是最直接的strace,只需要執行 sudo strace -p 12345 或者 strace -f 指令(-f 即同時追蹤fork出來的子程序),這就行了。輸出一般會非常大,所以你可能想要把它重定向到一個檔案以便作更多的分析(只需要加上 &> 檔名)。

再就是ltrace,有點類似strace,不同的是,它輸出的是庫函式呼叫。引數大體相同。

還有lsof 用來指出你在ltrace/strace中看到的控制代碼數值的意義。比如:

Shell
1 lsof-p12345

更好的跟蹤

使用簡單而可以做很多事情-人人都該裝上htop!

Shell
12 sudo apt-getinstall htopsudo htop

現在找到那些你想要的程序,再輸入:

Shell
123 s-代表系統呼叫過程(類似strace)L-代表庫呼叫過程(類似ltrace)l-代表lsof

監控

沒 有好的持續的伺服器監控,但是如果你曾遇到一些很詭異的情況,諸如為什麼一切都執行的那麼慢,那些系統資源都幹什麼去了,。。。等這些問題,想弄明白卻又 無處下手之際,不必動用iotopiftophtopiostatvmstat這些工具,就用dstat吧!它可以做之前我們提過的大部分工作可 以做的事情,而且也許可以做的更好!
它會用一種緊湊的,程式碼高亮的方式(不同於iostat,vmstat)向你持續展示資料,你還經常可以看到過去的資料(不同於iftop、iostop、htop)。

只需執行:

Shell
1 dstat--cpu--io--mem--net--load--fs--vm--disk-util--disk-tps--freespace--swap--top-io--top-bio-adv

很可能有一種更簡短的方式來寫上面這條命令,

這是一個相當複雜而又強大的工具,但是這裡我只提到了一些基本的內容(安裝以及基礎的命令)

Shell
12 sudo apt-getinstall gdb python-dbgzcat/usr/share/doc/python2.7/gdbinit.gz>~/.gdbinit

用python2.7-dbg 執行程式:

Shell
1 sudo gdb-p12345

現在使用:

C
123 bt-堆疊跟蹤(C級別)pystack-python堆疊跟蹤,不幸的是你需要有~/.gdbinit並且使用python-dbgc-繼續

發生段錯誤?用faulthandler !

python 3.3版本以後新增的一個很棒的功能,可以向後移植到python2.x版本。只需要執行下面的語句,你就可以大抵知道什麼原因引起來段錯誤。

Python
12 importfaulthandlerfaulthandler.enable()

記憶體洩露

嗯,這種情況下有很多的工具可以使用,其中有一些專門針對WSGI的程式比如Dozer,但是我最喜歡的當然是objgraph。使用簡單方便,讓人驚訝!
它沒有整合WSGI或者其他,所以你需要自己去發現執行程式碼的方法,像下面這樣:

Shell
123 import objgraphobjs=objgraph.by_type("Request")[:15]objgraph.show_backrefs(objs,max_depth=20,highlight=lambdav:vinobjs,
Shell
123 filename="/tmp/graph.png")Graph written to/tmp/objgraph-zbdM4z.dot(107nodes)Image generated as/tmp/graph.png

你會得到像這樣一張

相關推薦

常用Python 除錯工具

以下是我做除錯或分析時用過的工具的一個概覽。如果你知道有更好的工具,請在評論中留言,可以不用很完整的介紹。 日誌 沒錯,就是日誌。再多強調在你的應用裡保留足量的日誌的重要性也不為過。你應當對重要的內容打日誌。如果你的日誌打的足夠好的話,單看日誌你就能發現問題所在。那

Windows環境下python爬蟲常用庫和工具的安裝(UrlLib、Re、Requests、Selenium、lxml、Beautiful Soup、PyQuery 、PyMySQL等等)

本文列出了使用python進行爬蟲時所需的常用庫和工具的安裝過程,基本上只有幾行命令列的功夫就可以搞定,還是十分簡單的。 一、UrlLib 與 Re 這兩個庫是python的內建庫,若系統中已經成功安裝了python的話,這兩個庫一般是沒有什麼問題的。 驗證 開啟命令列,進入

python程式碼除錯工具~pdb

新增斷點 指定函式:b func_name指定行號:b line_num指定斷點編號處發生中斷的條件:condition 2 a==7表示在斷點2處出現a==7時,產生中斷 刪除斷點 刪除斷點只能根據編號進行刪除,如刪除1號斷點:cl 1 檢視斷點 b 執行程式碼 單步跟蹤,不進入函式:n單步跟

人生苦短,python(提升效率篇)——自動化規範程式碼工具autopep8

程式碼規範化能提高程式碼的可讀性和優美程度,下面推薦一個自動化規範程式碼工具,配置簡單高效。 當前環境:Win10+pycharm+python3.6 安裝 以管理員身份執行cmd,輸入: pip install autopep8 在pycharm中配置 File-

常用Python來監控女神的QQ空間!就算她把遮蔽了,也無法阻止

誰還沒暗戀過哪個妹子啊!當然那些暗戀的妹子應該稱做為女生,今天就教大家一個簡單的算是爬蟲的案例吧!主要實現的功能就是:監控女神的 QQ空間,一旦女神釋出新的說說,你的郵箱馬上就會收到說說內容,是不是想了解一下 先看看程式碼執行效果圖: Python學習群865597862

Python常用庫與工具

(Ⅰ)Python四個常用庫 1. numpy:(Numeric Python 開源的 數值計算擴充套件。可用來儲存和處理大型矩陣) 一個用python實現的 科學計算包。 包括:1、一個強大的N維陣列物件Array;2、比較成熟的(廣播)函式庫;3、用於整合C/C++和Fortra

使用python編寫工具處理DHT22驅動除錯資訊

某天晚上,下了班回到家,無意中找到以前用的溫度感測器DHT22,如下圖, 然後在電腦搜了下,還好,有程式,STM32的,可以跑下,可是跑了後發現程式不穩定。 然後就把讀出來的5個數據(兩個位元組溼度+兩個位元組溫度+一個位元組效驗位)跟計算出來的效驗位通

gdb除錯工具常用命令

編譯程式時需要加上-g,之後才能用gdb進行除錯:gcc -g main.c -o main gdb中命令: 回車鍵:重複上一命令 (gdb)help:檢視命令幫助,具體命令查詢在gdb中輸入help + 命令,簡寫h (gdb)run:重新開始執行檔案(run-text:載入文字檔

的Android NDK之旅(四),android串列埠通訊-mac+串列埠除錯工具

一些關於串列埠的知識 什麼是串列埠 串列埠是計算機上一種非常通用裝置通訊的協議,不要與通用序列匯流排Universal Serial Bus(USB)混淆。大多數計算機包含兩個基於RS232的串列埠。串列埠同時也是儀器儀表裝置通用的通訊協議;很多GP

[HOWTO]: Linux/Android常用除錯工具

本文介紹Linux/Android一些常用的除錯工具及其使用說明,作為備忘,持續更新中。 注意:大部分都不是本人原創,是從各地方蒐集而來,原作者也未一一追溯,所以沒有出處說明,如有冒犯,請評論或私信,我會盡快修改。 FIQ-Debugger fiq debugger是整

常用串列埠除錯工具比較

目前有許多免費的串列埠除錯工具,比較常用的有: 1、友善串列埠除錯助手(v3.8.5) 優點: 1)使用方便,超級穩定,不宕機,不丟包; 2)串列埠自動識別,支援COM9以上串列埠; 3)支援多串列埠除錯; 4)支援歷史傳送記錄; 5)廣泛支援各種

開發人員必備除錯工具,chrome除錯工具常用功能整理

Elements chrome devtools 中 Elements panel 是審查 dom 元素和 css 的, 可以實時修改 dom/css. windows: ctrl + shift + imac: cmd + opt + iDOM修改 html &

Linux除錯工具strace和gdb常用命令小結-轉

最近在Linux環境下做C語言專案,由於是在一個原有專案基礎之上進行二次開發,而且專案工程龐大複雜,出現了不少問題,其中遇到最多、花費時間最長的問題就是著名的“段錯誤”(Segmentation Fault)。藉此機會系統學習了一下,這裡對Linux環境下的段錯誤做個小結,方便以後同類問題的排查與解決。 1

常用的網路測試工具

最近學習了一些網路測試方面的東西,先做個小結,也算給自己理清一下思路。 1. 網路相關測什麼? From internet: 網路效能五項指標:Availability, Response time, networkutilization, network throughp

python在Ubuntu系統下的除錯工具pdb

使用 pdb 進行除錯 pdb 是 python 自帶的一個包,為 python 程式提供了一種互動的原始碼除錯功能,主要特性包括設定斷點、單步除錯、進入函式除錯、檢視當前程式碼、檢視棧片段、動態改變變數的值等。pdb 提供了一些常用的除錯命令 參考連結

Chrome:inspect檢視android資料庫常用的幾種配置方法、chrome://inspect除錯工具離線包

目錄 前言 步驟: 總結: 前言 android比較常用的資料庫框架分別是:greendao、ormlite、realm,對於這三種資料庫的優缺點,既然你要使用了,就說明你有一定的瞭解,在這裡就不介紹了!如果需要可自行google搜尋即可。接下來

android常用除錯工具fiddle、wireshark和android studio的配置

Fiddle配置android代理 在wifi的同一個區域網環境的windows主機中安裝fiddler,並且啟動,如本次192.168.3.14 在android手機端配置代理為該主機 還有一種方式通過wireshark抓手機的包通過wireshark抓包 配置手提

關於的python+web開發的除錯工具

        最近在做python+web開發,採用的是cig模式。但是偶爾會出現請求失敗的情況,具體來說就是使用者在開啟新的頁面的時候,python與後臺server的通訊會卡在某個地方,具體的原因一直搞不清楚,所以想利用python的相關除錯工具來解決這個問題。但是p

Python 擼了一個 plist 圖集拆圖工具!附上github原始碼

這些年,我一直在使用 JavaScript 、CocosCreator 做開發,只要是他們不能解決的,我都不太願意去弄,或者說是不太情願去做。真的是手中有把錘子,看什麼都是釘子,越是熟悉一樣東西,越容易被**思維定式**給束縛,難以成長! 前段時間,我在嘗試學習 Python,想用來做點什麼,一直沒想好。我

python工具:用python操作HP的Quality Center

over cti 步驟 response headers 服務器 登錄 chm format 背景是這樣的:這個組的測試人員每跑一個case都要上傳測試結果附件到QC。每個待測功能模塊可能包含幾十上百的case。於是手工上傳測試結果變成了繁重的體力勞動。令人驚訝的是我們的工