2012-08-27 77 views
0

我有一個相當大的客戶端 - 服務器網絡應用程序,用Python編寫。我使用select.poll來提供異步功能。在過去的六個月裏,一切都很順利。然而,最近我改變了一些東西,並允許客戶端從服務器上可靠地註銷。乍看之下,客戶從未收到要求,而且還遭到封鎖。當我殺的過程中有,我收到了以下的輸出:Python select.select,select.poll:損壞的雙鏈表

*** glibc detected *** /usr/bin/python: corrupted double-linked list: 0x0a9fea60 *** 
======= Backtrace: ========= 
/lib/i386-linux-gnu/libc.so.6(+0x6cbe1)[0xd96be1] 
/lib/i386-linux-gnu/libc.so.6(+0x6fc1c)[0xd99c1c] 
/lib/i386-linux-gnu/libc.so.6(__libc_malloc+0x63)[0xd9b1d3] 
/usr/lib/i386-linux-gnu/libxcb.so.1(+0x8ff6)[0xb30ff6] 
/usr/lib/i386-linux-gnu/libxcb.so.1(+0x706d)[0xb2f06d] 
/usr/lib/i386-linux-gnu/libxcb.so.1(+0x75b5)[0xb2f5b5] 
/usr/lib/i386-linux-gnu/libxcb.so.1(xcb_writev+0x67)[0xb2f667] 
/usr/lib/i386-linux-gnu/libX11.so.6(_XSend+0x14b)[0x59b42b] 
/usr/lib/i386-linux-gnu/libX11.so.6(_XFlush+0x39)[0x59b889] 
/usr/lib/i386-linux-gnu/libX11.so.6(XFlush+0x31)[0x57ba81] 
/usr/lib/libSDL-1.2.so.0(+0x34dfe)[0x16adfe] 
/usr/lib/libSDL-1.2.so.0(+0x37998)[0x16d998] 
/usr/lib/libSDL-1.2.so.0(+0x393db)[0x16f3db] 
/usr/lib/libSDL-1.2.so.0(SDL_PumpEvents+0x3d)[0x140d7d] 
/usr/lib/libSDL-1.2.so.0(SDL_PollEvent+0x17)[0x140db7] 
/usr/lib/libSDL-1.2.so.0(SDL_EventState+0x58)[0x140f78] 
/usr/lib/libSDL-1.2.so.0(SDL_JoystickEventState+0x5b)[0x16810b] 
/usr/lib/python2.7/dist-packages/pygame/joystick.so(+0x196d)[0x55896d] 
/usr/lib/python2.7/dist-packages/pygame/base.so(+0x178a)[0x56078a] 
/usr/lib/python2.7/dist-packages/pygame/base.so(+0x17c7)[0x5607c7] 
/usr/bin/python(PyEval_EvalFrameEx+0x4332)[0x80de822] 
/usr/bin/python(PyEval_EvalCodeEx+0x127)[0x80e11e7] 
/usr/bin/python[0x8105a61] 
/usr/bin/python(PyObject_Call+0x4a)[0x80a464a] 
/usr/bin/python(PyEval_CallObjectWithKeywords+0x44)[0x80da034] 
/usr/bin/python(Py_Finalize+0xc7)[0x8070ee1] 
/usr/bin/python(Py_Main+0xc66)[0x805c109] 
/usr/bin/python(main+0x1b)[0x805b25b] 
/lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0xd40e37] 
/usr/bin/python[0x81074ad] 

隨後存儲器映射,這我不張貼爲簡潔起見。我運行PDB下的代碼,發現客戶端在pollingObject.poll(0)的呼叫中阻塞了,這應該不會被阻止。所以,我把這個電話改爲select.select([socket], [], [], 0),仍然沒有成功。我使用PyGame,如果這有所作爲,我知道它有時會。我完全迷失在這裏。我知道Python覆蓋了malloc,它可能與此有關嗎?

+0

你改變了什麼?恢復更改是否解決了問題?您是否升級或更改了計算機上的軟件? – nneonneo

+0

恢復更改不會執行任何操作。 – chameco

+0

因此,如果恢復不能解決問題,那麼問題一定在其他地方。尋找最近的軟件升級或軟件包安裝... – nneonneo

回答

0

我設法通過在C中實現網絡代碼並從Python調用它來解決它。

0

在我看來,像PyGame在X連接關閉後檢查輸入事件,由於終結器。用Display *調用Xlib中任何已經傳遞給XCloseDisplay的東西意味着訪問已經釋放的內存,當然,如果這是發生的事情,那麼glibc的堆被破壞並不奇怪。

如果我的診斷是正確的,您將無法在應用程序級別真正修復它,但生成一個最小的測試用例並將其提交給PyGame開發人員可能會很有成效。