python - 如何用python调试死锁?

标签 python multithreading debugging deadlock

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

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

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

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

最佳答案

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

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

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

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

关于python - 如何用python调试死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/527296/

相关文章:

python - 属性错误 : 'GridSearchCV' object has no attribute 'best_estimator_'

Java - 如何从 GUI 安全地停止 Web 应用程序中的线程?

html - 如何阻止占位符转换回来? (CSS)

debugging - Arduino/AVR ATmega 微 Controller ,随机复位、跳转或变量/数据损坏

c# - Debug.Assert 不会进入 MonoDevelop/MonoTouch 中的编辑器

python - 修复列表中损坏的 html 元素

python - FROM random IMPORT* 和 IMPORT random 有什么区别? (随机()和随机范围())

python - 如何检测计算机是否使用 Python 连接到互联网?

python - Python 中是否可以在线程内生成进程?

java - 为什么读者和作者众多,却陷入僵局