Python select.select, select.poll: поврежденный двусвязный список

У меня есть довольно большое клиент-серверное сетевое приложение, написанное на 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, может ли это быть связано с этим?


person Samuel Breese    schedule 27.08.2012    source источник
comment
Что вы изменили? Отмена изменения решает проблему? Вы обновили или изменили программное обеспечение на своем компьютере?   -  person nneonneo    schedule 27.08.2012
comment
Отмена изменения ничего не дает.   -  person Samuel Breese    schedule 27.08.2012
comment
Итак, если возврат не помогает, проблема должна быть где-то в другом месте. Найдите недавнее обновление программного обеспечения или установку пакета...   -  person nneonneo    schedule 27.08.2012


Ответы (2)


Мне удалось исправить это, реализовав сетевой код на C и вызвав его из Python.

person Samuel Breese    schedule 10.10.2012

Мне кажется, что PyGame проверяет события ввода после закрытия соединения X из-за финализаторов. Вызов чего-либо в Xlib с Display *, который уже был передан XCloseDisplay, означает, конечно, доступ к уже освобожденной памяти, и если это то, что происходит, неудивительно, что куча glibc повреждается.

Если мой диагноз верен, вы не сможете по-настоящему исправить это на уровне приложения, но создание минимального тестового примера и отправка его разработчикам PyGame может быть продуктивным.

person Jamey Sharp    schedule 06.11.2012