python segmentation-fault mod-wsgi

Python Segfaults en PyObject_Malloc



segmentation-fault mod-wsgi (1)

Es muy, muy fácil bloquear el tiempo de ejecución de CPython con una extensión errónea de C.

Un error muy pequeño en el recuento de referencias o una pequeña corrupción en el manejo de la memoria puede hacer que el sistema sea inestable. La posición real del choque normalmente no dará ningún indicio viable de la verdadera causa del problema, ya que muchas veces el choque real ocurre mucho más tarde, después de la causa.

No puedo decir mucho sobre los errores de valgrind, pero también diría que no hay errores de valgrind en la extensión, eso no significa que no haya errores. Valgrind, por ejemplo, no conoce el sistema de conteo de referencias del tiempo de ejecución de Python, y los pequeños errores en el recuento de referencias son a menudo el motivo de los bloqueos. Además, el hecho de que obtenga errores de "valor no inicializado" en el tiempo de ejecución de Python podría deberse a que hay un error de recuento de referencia. Cuando una extensión C crea tal situación, el código de tiempo de ejecución causará problemas, la razón no está en el tiempo de ejecución, sino en la extensión.

Sin ver la extensión C, supongo que no es posible realizar otro diagnóstico. ¿Implementaste la extensión tú mismo o es un software de código abierto? ¿Está muy extendido?

Trataría de reducir las funciones de la extensión que, cuando se usa, crea el problema. Si tiene suerte, se puede reducir a una función llamada con un conjunto especial de parámetros. Tal vez el autor podría ayudar a encontrar el error?

No importa qué versión de Python intento (2.7, 3.2, 3.4) obtengo un segfault en esta línea de código:

Program received signal SIGSEGV, Segmentation fault. _PyObject_Malloc (ctx=0x0, nbytes=50) at Objects/obmalloc.c:1159 1159 if ((pool->freeblock = *(block **)bp) != NULL) {

Mi aplicación es una aplicación mod_wsgi y estoy usando una extensión C con OpenSSL (pero no veo errores en la extensión C incluso con vagrind). No puedo reproducir el error con valgrind, pero valgrind proporciona muchos errores que no se suprimen con el archivo de supresión de python proporcionado. Por ejemplo:

==4800== Use of uninitialised value of size 8 ==4800== at 0xD95E42A: PyEval_EvalFrameEx (ceval.c:2430) ==4800== by 0xD964614: PyEval_EvalCodeEx (ceval.c:3585) ==4800== by 0xD8C092F: function_call (funcobject.c:632) ==4800== by 0xD89411E: PyObject_Call (abstract.c:2067) ==4800== by 0xD95FC23: PyEval_EvalFrameEx (ceval.c:4558) ==4800== by 0xD964614: PyEval_EvalCodeEx (ceval.c:3585) ==4800== by 0xD8C080E: function_call (funcobject.c:632) ==4800== by 0xD89411E: PyObject_Call (abstract.c:2067) ==4800== by 0xD95FC23: PyEval_EvalFrameEx (ceval.c:4558) ==4800== by 0xD963BE0: PyEval_EvalFrameEx (ceval.c:4331) ==4800== by 0xD963BE0: PyEval_EvalFrameEx (ceval.c:4331) ==4800== by 0xD964614: PyEval_EvalCodeEx (ceval.c:3585)

Estoy usando mod_wsgi versión 4.3.0 y Python 3.4.2 en esta instancia en particular, pero otras versiones también fallan. Siempre está en if ((pool->freeblock = *(block **)bp) != NULL) { line.