python - 如何使用 GDB 调试 asyncio 协程?

标签 python python-3.x asynchronous gdb python-asyncio

There is some extension允许使用 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 为每个协程创建的单独堆栈跟踪的结果。

目标是正确调试异步应用程序。那么,如何查看执行堆栈和中断/继续协程?

最佳答案

经过长时间的挖掘,我找到了一个替代解决方案:简单而神奇的 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

注意,在某些环境中很重要:就像 gdb 一样,要在 Docker 容器中使用,py-spy 需要设置标志 SYS_PTRACE

关于python - 如何使用 GDB 调试 asyncio 协程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65508239/

相关文章:

python - 带/不带参数的 Django 管理命令

python - 子流程错误处理

python - 使用 urllib.request 验证 HTTPS 证书

python - 从列表中提取最长的子序列。无法找出类型错误

Python独立运行多个后台循环

python - 属性错误: 'SQLAlchemy' object has no attribute 'datetime'

python - 如何使用 Python 和 Google 日历 API 创建 Google 日历事件

python-3.x - 计算组合在日志中使用的次数

javascript - JavaScript Promise 中异步失败引发异常

javascript - 淡入完成后淡出后异步/等待超时