如何使用python调试死锁?

Fan*_*Lin 6 python debugging multithreading deadlock

我正在开发一个多线程应用程序,它正在陷入僵局.

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

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

我想知道有没有办法在我暂停程序后转储python代码的调用堆栈?我怎么知道线程中的锁是什么造成了死锁?

Hei*_*nen 6

如果您可以使用gcc编译扩展模块(例如,使用Cygwin),则可以使用gdb和pystack gdb宏来获取Python堆栈.我不知道是否可以在Visual C++ Express中执行与pystack相同的操作,但是无论如何你都可以从pystack宏实现中获得一些想法.

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

您可能还会通过向代码添加大量日志记录调用来获取一些重要信息,包括Python端和C++扩展.

无论如何,我几乎可以肯定死锁不是由Queue引起的,而是你自己的代码.