2012-08-27 3 views
0

파이썬으로 작성된 다소 큰 클라이언트 - 서버 네트워크 응용 프로그램이 있습니다. 비동기 기능을 제공하기 위해 select.poll을 사용하고 있습니다. 지난 6 개월 동안 모든 것이 잘되었습니다. 그러나 최근에는 몇 가지 사항을 변경하여 클라이언트가 서버에서 안전하게 로그 오프 할 수 있도록했습니다. 언뜻보기에는 클라이언트가 요청을받지 못했고 또한 차단되었습니다. 나는 간결하게하기 위해 게시 아니에요 메모리 맵, 다음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)으로 바꿨지만 여전히 성공하지 못했습니다. 나는 파이 게임을 사용하고 있습니다. 차이가 있다면, 때로는 알고 있습니다. 나는 여기서 완전히 잃어 버렸어. 나는 파이썬이 malloc을 오버라이드한다는 것을 알고있다.

+0

무엇이 변경 되었습니까? 변경 사항을 되 돌리면 문제가 해결됩니까? 컴퓨터에서 소프트웨어를 업그레이드하거나 변경 했습니까? – nneonneo

+0

변경 사항을 되돌리려면 아무런 변화가 없습니다. – chameco

+0

그래서 되돌리기로 문제가 해결되지 않으면 문제가 다른 곳에서 발생해야합니다. 최근의 소프트웨어 업그레이드 또는 패키지 설치를 찾습니다 ... – nneonneo

답변

0

C로 네트워크 코드를 구현하고 Python에서 호출하여 문제를 해결할 수있었습니다.

0

finalizer 때문에 X 연결이 닫힌 후 PyGame이 입력 이벤트를 확인하는 것처럼 보입니다. Display *이 이미 XCloseDisplay으로 전달 된 Xlib을 호출하면 이미 해제 된 메모리에 액세스한다는 것을 의미합니다. 그럴 경우 glibc의 힙이 손상되는 것은 당연한 일입니다.

제 진단이 정확하다면, 응용 프로그램 수준에서 진정으로 수정할 수는 없지만 최소한의 테스트 사례를 만들어 PyGame 개발자에게 제출하면 생산성이 높아질 수 있습니다.