在開發系統時所經歷的情緒的過山車是任何一個即使接觸很少的人都可以強烈表達的。然而,對於那些在各種專案和應用程式方面擁有豐富經驗的人來說,從頭開始建立系統通常被認為是夢想的情況。
當您需要維護、支援或發展現有的正在運行的系統時(有時有數千或數百萬用戶),真正的噩夢就會出現。軟體開發中《但丁地獄》的最深一層是當你必須除錯程式碼來解決問題。
我知道有時,尤其是當你剛開始時,你依賴最簡單、最非正式的 print() 及其在其他語言中的等效項。 不用擔心,我們的秘密在這裡是安全的。然而,我們也知道,對於最痛苦、最棘手的 bug,我們需要使用高效、強大、全面的調試工具。
我被要求分析工作中的一些效能問題。使用 Grafana 對函數/類別返回或時間追蹤進行淺層調查不足以找到所有混亂程式碼中的真正問題。那麼...讓我們來調試吧!
在 Python 中,我們有 PDB,一個用於偵錯程式碼的簡單函式庫。要使用它,您只需使用 pip 安裝它。例如:
pip install pdb
然後在要偵錯的程式碼中加入一行:
import pdb; pdb.set_trace()
這將是您的斷點。現在,您可以再次運行您的應用程序,它將在您剛剛添加的行之後立即暫停執行。然後,您可以逐行、逐個函數地逐步執行程式碼,以找到您需要解決的問題。
上面的設定應該足以滿足使用 Django、Flask 或 FastAPI 的簡單 Python 專案。但是,如果您已經達到這一點並且正在運行您的應用程式在 Docker 容器內,遇到問題,我也遇到過同樣的問題。保持冷靜,只需按照以下步驟即可:
1 - 您應該安裝遠端偵錯器,而不是通常的PDB。在 Docker 容器內運行它(或將庫包含在依賴項管理器中):
pip install remote-pdb
2 - 在 docker-compose.yml 檔案中,新增連接埠 以公開 PDB 入口點:
... services: your-app: ... ports: - 8000:8000 # already existing port of your application - 4444:4444 # NEW LINE TO EXPOSE PDB PORT ... ...
3 - 仍然在 docker-compose.yml 檔案中,新增這兩行,以允許從 Docker 外部向正在運行的容器發送命令:
... services: your-app: ... ports: - 8000:8000 - 4444:4444 stdin_open: true # THIS tty: true # AND THIS ... ...
4 - 最後,將程式碼中的斷點行改為以下行:
__import__("remote_pdb").set_trace(host='0.0.0.0', port=4444)
現在您也可以執行 Docker 映像,並從我們開啟的 連接埠 4444 連接 PDB 偵錯器,在您最喜歡的終端機中使用簡單的 telnet 命令:
telnet 0.0.0.0 4444
要巧妙地在程式碼的海洋中航行,您需要使用 PDB 提供的有用的命令。讓我們在這裡看看其中的一些:
我通常只用指令step (s)和next (n)。兩者之間的差異在於步驟執行每一行,甚至是在目前行上呼叫的函數內的那些行。接下來只執行目前函數內的行,等待被呼叫函數的回傳。
其他兩個有用的命令是 return (r),執行所有函數直到返回,以及 continue (c),執行所有內容直到下一個斷點。
希望本內容對您有幫助。透過調查一個重大的效能問題並在撰寫本文時加強我的學習,我可以保證
「使用正確的工具完成正確的工作」
身為軟體開發人員,我們永遠不應該忘記這一點。它可以將我們的事業提升到更有效的水平並為這趟過山車之旅帶來更多快樂。
以上是如何在 Docker 容器內調試 Python 和 Django 應用程式的詳細內容。更多資訊請關注PHP中文網其他相關文章!