搜尋
首頁後端開發Python教學常用的 Python 偵錯工具,Python開發必讀

日誌

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

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

追蹤

有時更好的辦法是看執行了哪些語句。你可以使用一些IDE的調試器的單步執行,但你需要明確知道你在找那些語句,否則整個過程會進行地非常緩慢。

標準函式庫裡面的trace模組,可以列印執行階段包含在其中的模組裡所有執行到的語句。 (就像製作一份專案報告)

python -mtrace –trace script.py

   

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

比如:

python -mtrace –trace script.py | egrep '^(mod1.py|mod2.py)'

   

調試器

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

import pdb
pdb.set_trace() # 开启pdb提示

   🎀

python -mpdb script.py

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

c or continue

q 或 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(類似圖形介面,特別適合瀏覽原始碼

遠端偵錯器

安裝方式:

sudo apt-get install winpdb

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

rrrerehed檔案-關聯

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

這樣做:

try:
(一段抛出异常的代码)
except:
    import pdb
    pdb.pm() # 或者 pdb.post_mortem()
  或者(输入 c 开始执行脚本)

   

只想要一個REPL環境?試試IPython如何?

如果你不需要一個完整齊全的調試器,那就只需要用一下的方式啟動一個IPython即可:

import rpdb2
rpdb2.start_embedded_debugger("secretpassword")

   

標準linux工具

我常常竟然未被驚訝於它們竟然充分利用它們竟然充分利用。你能用這些工具解決很大範圍內的問題:從效能問題(太多的系統調用,記憶體分配等等)到死鎖,網路問題,磁碟問題等等。

其中最有用的是最直接的strace,只需要運行 sudo strace -p 12345 或 strace -f 指令(-f 即同時追蹤fork出來的子進程),這就行了。輸出通常會非常大,所以你可能想要把它重定向到一個檔案以便做更多的分析(只需要加上 &> 檔案名稱)。

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

還有lsof 用來指出你在ltrace/strace中看到的句柄數值的意義。例如:

lsof -p 12345

更好的追蹤

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

sudo apt-get install htop

sudo htop

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

s - 代表系統調用過程(類似strace)

L - 代表庫調用過程(類似代表庫調用

l - 代表lsof

  監控

沒有好的持續的伺服器監控,但是如果你曾遇到一些很詭異的情況,諸如為什麼一切都運行的那麼慢,那些系統資源都乾什麼去了,。 。 。等這些問題,想弄清楚卻又 無處下手之際,不必動用iotop,iftop,htop,iostat,vmstat這些工具,就用dstat吧!它可以做之前我們提過的大部分工作可 以做的事情,也許可以做的更好!

它會用一種緊湊的,代碼高亮的方式(不同於iostat,vmstat)向你持續展示數據,你還經常可以看到過去的數據(不同於iftop,iostop,htop)。

只需運行:

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

很可能有一种更简短的方式来写上面这条命令,

这是一个相当复杂而又强大的工具,但是这里我只提到了一些基本的内容(安装以及基础的命令)

sudo apt-get install gdb python-dbg

zcat /usr/share/doc/python2.7/gdbinit.gz > ~/.gdbinit

用python2.7-dbg 运行程序:

sudo gdb -p 12345

现在使用:

bt - 堆栈跟踪(C 级别)

pystack - python 堆栈跟踪,不幸的是你需要有~/.gdbinit 并且使用python-dbg

c - 继续

  发生段错误?用faulthandler !


  python 3.3版本以后新增的一个很棒的功能,可以向后移植到python2.x版本。只需要运行下面的语句,你就可以大抵知道什么原因引起来段错误。

import faulthandler

faulthandler.enable()

内存泄露

嗯,这种情况下有很多的工具可以使用,其中有一些专门针对WSGI的程序比如Dozer,但是我最喜欢的当然是objgraph。使用简单方便,让人惊讶!

它没有集成WSGI或者其他,所以你需要自己去发现运行代码的方法,像下面这样:

import objgraph

objs = objgraph.by_type("Request")[:15]

objgraph.show_backrefs(objs, max_depth=20, highlight=lambda v: v in objs,


filename="/tmp/graph.png")

Graph written to /tmp/objgraph-zbdM4z.dot (107 nodes)

Image generated as /tmp/graph.png

你会得到像这样一张图(注意:它非常大)。你也可以得到一张点输出。

内存使用

有时你想少用些内存。更少的内存分配常常可以使程序执行的更快,更好,用户希望内存合适好用)

有许多可用的工具,但在我看来最好用的是pytracemalloc。与其他工具相比,它开销非常小(不需要依赖于严重影响速度的sys.settrace)而且输出非常详尽。但安装起来比较痛苦,你需要重新编译python,但有了apt,做起来也非常容易。

只需要运行这些命令然后去吃顿午餐或者干点别的:

apt-get source python2.7

cd python2.7-*

wget? https://github.com/wyplay/pytracemalloc/raw/master/python2.7_track_free_list.patch

patch -p1

debuild -us -uc

cd ..

sudo dpkg -i python2.7-minimal_2.7*.deb python2.7-dev_*.deb

接着安装pytracemalloc (注意如果你在一个virtualenv虚拟环境下操作,你需要在重新安装python后再次重建 – 只需要运行 virtualenv myenv)

pip install pytracemalloc

现在像下面这样在代码里包装你的应用程序

import tracemalloc, time
tracemalloc.enable()
top = tracemalloc.DisplayTop(
    5000, # log the top 5000 locations
    file=open('/tmp/memory-profile-%s' % time.time(), "w")
)
top.show_lineno = True
try:
    # code that needs to be traced
finally:
    top.display()

   

  输出会像这样:


2013-05-31 18:05:07: Top 5000 allocations per file and line

 #1: .../site-packages/billiard/_connection.py:198: size=1288 KiB, count=70 (+0),

average=18 KiB

 #2: .../site-packages/billiard/_connection.py:199: size=1288 KiB, count=70 (+0),

average=18 KiB

 #3: .../python2.7/importlib/__init__.py:37: size=459 KiB, count=5958 (+0),

average=78 B

 #4: .../site-packages/amqp/transport.py:232: size=217 KiB, count=6960 (+0),

average=32 B

 #5: .../site-packages/amqp/transport.py:231: size=206 KiB, count=8798 (+0),

average=24 B

 #6: .../site-packages/amqp/serialization.py:210: size=199 KiB, count=822 (+0),

average=248 B

 #7: .../lib/python2.7/socket.py:224: size=179 KiB, count=5947 (+0), average=30

B

 #8: .../celery/utils/term.py:89: size=172 KiB, count=1953 (+0), average=90 B

 #9: .../site-packages/kombu/connection.py:281: size=153 KiB, count=2400 (+0),

average=65 B

 #10: .../site-packages/amqp/serialization.py:462: size=147 KiB, count=4704

(+0), average=32 B

  …


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Numpy數組與使用數組模塊創建的數組有何不同?Numpy數組與使用數組模塊創建的數組有何不同?Apr 24, 2025 pm 03:53 PM

numpyArraysareAreBetterFornumericalialoperations andmulti-demensionaldata,而learthearrayModuleSutableforbasic,內存效率段

Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Numpy數組的使用與使用Python中的數組模塊陣列相比如何?Apr 24, 2025 pm 03:49 PM

numpyArraySareAreBetterForHeAvyNumericalComputing,而lelethearRayModulesiutable-usemoblemory-connerage-inderabledsswithSimpleDatateTypes.1)NumpyArsofferVerverVerverVerverVersAtility andPerformanceForlargedForlargedAtatasetSetsAtsAndAtasEndCompleXoper.2)

CTYPES模塊與Python中的數組有何關係?CTYPES模塊與Python中的數組有何關係?Apr 24, 2025 pm 03:45 PM

ctypesallowscreatingingangandmanipulatingc-stylarraysinpython.1)usectypestoInterfacewithClibrariesForperfermance.2)createc-stylec-stylec-stylarraysfornumericalcomputations.3)passarraystocfunctions foreforfunctionsforeffortions.however.however,However,HoweverofiousofmemoryManageManiverage,Pressiveo,Pressivero

在Python的上下文中定義'數組”和'列表”。在Python的上下文中定義'數組”和'列表”。Apr 24, 2025 pm 03:41 PM

Inpython,一個“列表” isaversatile,mutableSequencethatCanholdMixedDatateTypes,而“陣列” isamorememory-sepersequeSequeSequeSequeSequeRingequiringElements.1)列表

Python列表是可變還是不變的?那Python陣列呢?Python列表是可變還是不變的?那Python陣列呢?Apr 24, 2025 pm 03:37 PM

pythonlistsandArraysareBothable.1)列表Sareflexibleandsupportereceneousdatabutarelessmory-Memory-Empefficity.2)ArraysareMoremoremoremoreMemoremorememorememorememoremorememogeneSdatabutlesserversEversementime,defteringcorcttypecrecttypececeDepeceDyusagetoagetoavoavoiDerrors。

Python vs. C:了解關鍵差異Python vs. C:了解關鍵差異Apr 21, 2025 am 12:18 AM

Python和C 各有優勢,選擇應基於項目需求。 1)Python適合快速開發和數據處理,因其簡潔語法和動態類型。 2)C 適用於高性能和系統編程,因其靜態類型和手動內存管理。

Python vs.C:您的項目選擇哪種語言?Python vs.C:您的項目選擇哪種語言?Apr 21, 2025 am 12:17 AM

選擇Python還是C 取決於項目需求:1)如果需要快速開發、數據處理和原型設計,選擇Python;2)如果需要高性能、低延遲和接近硬件的控制,選擇C 。

達到python目標:每天2小時的力量達到python目標:每天2小時的力量Apr 20, 2025 am 12:21 AM

通過每天投入2小時的Python學習,可以有效提升編程技能。 1.學習新知識:閱讀文檔或觀看教程。 2.實踐:編寫代碼和完成練習。 3.複習:鞏固所學內容。 4.項目實踐:應用所學於實際項目中。這樣的結構化學習計劃能幫助你係統掌握Python並實現職業目標。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

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

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具