簡體   English   中英

如何使用 GDB 調試異步協程?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM