Python select.select,select.poll:已损坏的双链接列表

Python select.select,select.poll:已损坏的双链接列表,python,select,pygame,polling,Python,Select,Pygame,Polling,我有一个相当大的客户机-服务器网络应用程序,是用Python编写的。我正在使用select.poll提供异步功能。在过去的六个月里,一切都很顺利。但是,最近我做了一些更改,允许客户端可靠地从服务器注销。乍一看,客户机似乎从未收到请求,而且,它正在阻塞。使用终止进程时,我收到以下输出: *** glibc detected *** /usr/bin/python: corrupted double-linked list: 0x0a9fea60 *** ======= Backtrace: ===

我有一个相当大的客户机-服务器网络应用程序,是用Python编写的。我正在使用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
,这可能与此有关吗?

我设法用C实现了网络代码并从Python调用它来修复它。

在我看来,PyGame似乎是在X连接关闭后检查输入事件,这是由于终结器。在Xlib中调用任何带有
Display*
且已经传递给
XCloseDisplay
的东西当然意味着访问已经释放的内存,如果是这样的话,glibc的堆损坏也就不足为奇了


如果我的诊断是正确的,您将无法在应用程序级别真正修复它,但是生成一个最小的测试用例并将其提交给PyGame开发人员可能会很有成效。

您做了哪些更改?恢复更改是否解决了问题?您是否升级或更改了计算机上的软件?还原更改不会产生任何效果。因此,如果还原无法解决问题,那么问题一定出在其他地方。查找最近的软件升级或软件包安装。。。