我有一个 python 程序。它有很多 eventlet 协程。 似乎有一天程序会死锁。我已经倾倒了它的内存。 我要找理由。 问题是如何使用gdb获取eventlet协程栈。
附加信息:
- 我知道如何通过 gdb 获取所有线程堆栈。但是到了eventlet协程,就变难了。因为我没有足够的关于 python 解释器的信息。
- 我也知道如何通过迭代所有对象来获取 python 程序中的所有 eventlet 协程堆栈。但是对于我们应该通过gdb检查所有对象的情况是没有用的。
最佳答案
没有像常规线程那样简单的方法。
不过,这里有一些提示可以帮助您:
- 有关使用 GDB 调试 Python 的多个有用类(class) http://grapsus.net/blog/post/Low-level-Python-debugging-with-GDB
- 使用
eventlet.backdoor
拥有用于调试的紧急进程内解释器http://eventlet.net/doc/modules/backdoor.html - 在
gc.get_objects()
中搜索greenlet
的实例,打印x.gr_frame
的堆栈In gevent, how can I dump stack traces of all running greenlets? - 设置信号处理程序(例如 USR1)迭代所有 greenthreads 并将它们的堆栈打印到 stderr
关于python - 如何通过gdb获取python eventlet堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33843027/