2012-12-19 48 views
-1

作爲一名本地Java開發人員,我想我已經達到了我習慣的情況。避免Python中的線程堆棧溢出錯誤的方法

我正在開發一個多線程的Python 2.7應用程序,它使用PyDev並在Windows 7 64位上從Eclipse上運行。它是多線程的,因爲它使用wxPython,因此它使用GUI主線程和繁重的線程(並且我的或者我有一些繁重的工作),每個回調使用一個線程。

我已經達到了一個點,在彈出的0xc00000fd錯誤python27.dll與一個appcrash消息。這發生在一個線程中的函數返回一個值。如果我減少了回調所使用的數據量,那麼這段代碼工作正常,所以我非常確定堆棧中的東西太多了,並且沒有任何遞歸變壞。

我可以在創建之前在線程上調用stack_size以增加可用空間,也許這可能會工作一段時間,如果我要弄清楚有多少空間可以滿足它。線程將不得不進行更多的工作,所以這看起來像是一種創可貼的情況。

我以爲Python使用堆內存創建堆棧,所以這不應該成爲Python中的問題?這是我的許多第三方apis之一,這是真正的罪犯嗎?那麼,如果沒有C語言中低級別的內存創建決策能力,我如何從堆棧和堆內存中獲得一些這樣的內容?

+0

解釋器崩潰顯然相當不正常。有什麼辦法可以生成一個低級崩潰報告,堆棧跟蹤(我的意思是CPU堆棧,而不是Python堆棧),寄存器值,線程等? – NPE

+0

作爲一個初步的,進入visual studio 2010.我一次又一次地看到multiarray.pyd!00000000052e13b3()這一行。也許Numpy或Numpy/Scipy的互動?最後一行是python27.dll!000000001e0a0a36。我將嘗試深入探究python和登錄等。 – demongolem

+0

查看模塊列表,有3個外部:scipy,sklearn和wx-2-8-msw-unicode(即wxPython)。線程列表有7個線程列出。線程ID 6284與列出的位置1e0a0077是崩潰的地方。我真的在想,Scipy(0.11.0),Numpy(1.6.2 MLK)和64位Windows的組合是我在做什麼的。 – demongolem

回答

7

Python should never crash out,爲Guido said

我不是說這是uncrashable。我在說,如果你崩潰了,那麼它就是一個錯誤,除非經過證實。

因此,碰撞被認爲是Python本身的錯誤,如果它發生的話。這是不太可能的,它很可能是你的擴展模塊之一做的不好,並採取Python。

我的建議是剝離的東西,直到你找到確切的問題是什麼。如果它只發生在覈心python的東西上,那麼你需要提交一個bug報告,否則,它需要去任何擴展模塊導致它的開發者。

+0

這不是真的。有時候,遞歸會導致問題。酸洗大件物品。 [這個答案](http://stackoverflow.com/questions/20629027/process-finished-with-exit-code-1073741571)爲我解決了它。 – simonzack