如何用python调试死锁?

Posted

技术标签:

【中文标题】如何用python调试死锁?【英文标题】:How to debug deadlock with python? 【发布时间】:2009-02-09 06:49:07 【问题描述】:

我正在开发一个多线程应用程序,这是死锁。

我正在使用 Visual C++ Express 2008 来跟踪程序。一旦发生死锁,我只是暂停程序并跟踪。我发现当死锁发生时,我的 C++ 扩展中会有两个名为 python 的线程。

他们都在python代码中使用了Queue,所以我猜死锁可能是由Queue引起的。但是,一旦扩展进入 python 代码,我只能从 VC++ 调试器中看到 asm 代码和二进制文件。

我想知道在我暂停程序后有什么方法可以转储python代码的调用堆栈吗?我怎么知道线程中有什么锁导致了死锁?

【问题讨论】:

Python 代码是从 C++ 程序调用的吗? 不,python程序导入了我写的一些c++扩展。 有趣的是,在python debugger documentation page上,没有thread这个词的踪迹。 如果线程停留在某个位置,此代码会打印线程的堆栈跟踪:gist.github.com/niccokunzmann/6038331 【参考方案1】:

如果您可以使用 gcc 编译您的扩展模块(例如,通过使用 Cygwin),您可以在这种情况下使用 gdb 和 pystack gdb 宏来获取 Python 堆栈。我不知道是否有可能在 Visual C++ Express 中做一些与 pystack 等效的事情,但无论如何你可能会从 pystack 宏实现中得到一些想法。

由于您提到您只能在 VC++ 调试器中看到 asm/binary,因此您应该确保使用调试符号编译 Python。如果 VC++ 仍然显示 asm,则可能是您需要告诉 VC++ 源文件在哪里(抱歉,多年来没有使用 VC++,所以如果是这种情况,我不知道您可能需要做什么) .

您还可以通过在代码中添加大量日志调用来获取一些重要信息,包括 Python 端和 C++ 扩展。

无论如何,我几乎可以肯定死锁不是由于队列,而是您自己的代码。

【讨论】:

你说得对,我发现死锁的根源是DirectShow。

以上是关于如何用python调试死锁?的主要内容,如果未能解决你的问题,请参考以下文章

如何用python按顺序获取一个线条组成的图形的点坐标

Python 如何写脚本?

如何用最好的工具来调试node.js

如何用gdb调试erlang运行期

如何用Python爬虫抓取JS动态筛选内容

如何用windbg调试因需加载的DLL