select - python 选择选择,select.poll: 已损坏的双链接列表

  显示原文与译文双语对照的内容
78 1

我有一个相当大的客户机服务器网络应用程序,用 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 能与这个有什么关系?

时间: 原作者:

63 3

我看到我像PyGame在关闭X 连接之后检查输入事件,因为终结器已经关闭。 用已经传递到 XCloseDisplayDisplay * 调用任何内容意味着访问已经释放的内存,当然,这是不令人惊讶的。

如果我的诊断是正确的,你将无法在应用程序级别上真正解决它,但是生成一个最小的测试用例。

...