有一个扩展允许您使用 GDB 来调试 Pythonic 进程,我安装了它并在我的 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 为每个协程创建了自己的调用堆栈。
能够看到调试加载的 Web 应用程序的过程内部对我来说非常重要。如何使用 GDB 查看调用堆栈和中断/继续协程?