[英]How to debug asyncio coroutines with GDB?
有一些擴展允許使用 GDB 查看 Python 進程的詳細信息,我安裝並嘗試將它與基於 aiohttp 的懸掛 web 應用程序一起使用。 但是,無論正在處理什么請求,我總是只看到主堆棧跟蹤,沒有有用的信息:
(gdb) py-bt
Traceback (most recent call first):
File "/usr/lib/python3.7/selectors.py", line 468, in select
fd_event_list = self._selector.poll(timeout, max_ev)
File "/usr/lib/python3.7/asyncio/base_events.py", line 1739, in _run_once
event_list = self._selector.select(timeout)
File "/usr/lib/python3.7/asyncio/base_events.py", line 539, in run_forever
self._run_once()
File "/usr/lib/python3.7/asyncio/base_events.py", line 571, in run_until_complete
self.run_forever()
File "/usr/local/lib/python3.7/dist-packages/aiohttp/web.py", line 433, in run_app
reuse_port=reuse_port))
File "./my-server/main.py", line 98, in <module>
web.run_app(app_main, host=host, port=port)
這可能是 asyncio 為每個協程創建的單獨堆棧跟蹤的結果。
目標是正確調試 asyncio 應用程序。 那么,如何查看執行堆棧和中斷/繼續協程呢?
經過長時間的挖掘,我找到了一個替代解決方案:簡單而神奇的py-spy ,與 gdb 相比,它不需要使用特殊構建的 Python 運行目標進程。 處理異步函數也沒有問題:這是一個簡單的使用場景:
pip install py-spy
# Get stack traces of active threads:
py-spy dump --pid 1
# Watch executing functions in realtime:
py-spy top --pid 1
此處提供完整描述: https://github.com/benfred/py-spy
注意,在某些環境中很重要:就像在 Docker 容器中使用 gdb 一樣,py-spy 需要設置標志SYS_PTRACE
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.