2009-02-09 73 views
4

我正在開發一個多線程應用程序,這是死鎖。如何用python調試死鎖?

我正在使用Visual C++ Express 2008來跟蹤程序。一旦發生死鎖,我只需暫停程序並追蹤。我發現當死鎖發生時,我的C++擴展中會有兩個線程叫做python。

所有的人都在Python代碼中使用Queue,所以我猜這個死鎖可能是由Queue造成的。但是,一旦擴展名進入python代碼,除了asm代碼和VC++調試器的二進制文件,我什麼也看不到。

我想知道有什麼方法可以在我暫停程序後轉儲python代碼的調用堆棧嗎?我怎麼知道線程中有什麼鎖造成了死鎖?

+0

從C++程序調用Python代碼? – 2009-02-09 07:24:21

+0

不,python程序導入了我寫的一些C++擴展。 – 2009-02-09 07:34:14

回答

5

如果你可以使用gcc編譯你的擴展模塊(例如,使用Cygwin),那麼你可以使用gdb和pystack gdb宏來獲得Python堆棧。我不知道是否有可能在Visual C++ Express中做一些等同於pystack的東西,但是無論如何,您可能會從pystack宏實現中獲得一些想法。

既然你提到你只能在VC++調試器中看到asm/binary,你應該確保你用調試符號編譯Python。如果VC++仍然顯示asm,可能需要告訴VC++源文件的位置(對不起,多年以來沒有使用過VC++,所以我不能說出在這種情況下你可能需要做什麼) 。

您可能還會通過向您的代碼添加大量日誌調用,包括Python端和C++擴展,獲得一些重要信息。

在任何情況下,我幾乎可以肯定死鎖不是由於隊列,而是你自己的代碼。