如何使用python调试死锁?

时间:2009-02-09 06:49:07

标签: python multithreading debugging deadlock

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

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

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

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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