Violación de segmento

Alberto Valverde alberto en toscat.net
Mie Ago 13 13:08:22 CEST 2008


xve wrote:
> El Friday 08 August 2008, Oscar (.teri) Triano escribió:
>   
>> 2008/8/8 xve <xve en zonaweb.info>
>>
>>     
>>> Hola a todos,
>>>
>>> Tengo desarrollada una aplicacion sobre Linux Debian con QT3, la cual
>>> cada n
>>> tiempo me emite el error "Violación de segmento", sin indicar nada mas, y
>>> no
>>> se como solucionar el problema. A veces, me lanza el error al iniciar la
>>> aplicacion, y otras veces cuando lleva mas de 8 horas de
>>> funcionamiento...
>>>
>>> Esta aplicacion va ejecutando threads cada n minutos.
>>>
>>> Agradezco cualquier ayuda
>>>
>>> Un saludo
>>> --
>>> xve
>>>
>>> _______________________________________________
>>> Lista de correo Python-es
>>> http://listas.aditel.org/listinfo/python-es
>>> FAQ: http://listas.aditel.org/faqpyes
>>>       
>> Usa gdb con python
>>
>>     
>>> gdb python
>>>       
>> Luego ejecutas el script principal con la función execfile. Cuando ocurra
>> la violación de segmento gdb parará el programa indicando en que función lo
>> hace y tal vez te indique el motivo. Para hacer esto necesitas los símbolos
>> de depuración de la versión de python que usas y de QT 3.
>> _______________________________________________
>> Lista de correo Python-es
>> http://listas.aditel.org/listinfo/python-es
>> FAQ: http://listas.aditel.org/faqpyes
>>     
>
> Hola Oscar, muchas gracias, creo que ya he visto donde esta el problema, 
> aunque no se muy bien como solucionarlo...
>
> He hecho esto:
> -----------------------------------------------------------
> $ gdb -q /usr/bin/python
> (gdb) run /home/xve/scripts/qtInfoServers/startInfoServers.py
> Starting 
> program: /usr/bin/python /home/xve/scripts/qtInfoServers/startInfoServers.py
> [Thread debugging using libthread_db enabled]
> [New Thread 0xb7d768c0 (LWP 2295)]
> [New Thread 0xb6448b90 (LWP 2306)]
> [New Thread 0xb5c47b90 (LWP 2307)]
> [New Thread 0xb5446b90 (LWP 2308)]
> [New Thread 0xb4c45b90 (LWP 2309)]
> [New Thread 0xb4444b90 (LWP 2310)]
> [New Thread 0xb3c43b90 (LWP 2311)]
> [New Thread 0xb3442b90 (LWP 2312)]
> [New Thread 0xb2c41b90 (LWP 2313)]
> [Thread 0xb3c43b90 (LWP 2311) exited]
> [Thread 0xb4444b90 (LWP 2310) exited]
> [Thread 0xb2c41b90 (LWP 2313) exited]
> [Thread 0xb3442b90 (LWP 2312) exited]
> [Thread 0xb5c47b90 (LWP 2307) exited]
> [Thread 0xb6448b90 (LWP 2306) exited]
> [Thread 0xb4c45b90 (LWP 2309) exited]
>
> Program received signal SIGSEGV, Segmentation fault.
> [Switching to Thread 0xb7d768c0 (LWP 2295)]
> 0xb70276ea in QLineEdit::drawContents () from /usr/lib/libqt-mt.so.3
> -----------------------------------------------------------

Sin tener ni idea de Qt, diría que el fallo puede deberse a que le estés
pasando un None como parámetro a una función de Qt que espera un puntero
a otra estructura de Qt devuelta por otra llamada a Qt. El None se
traduce a un NULL por lo que al intentar dereferenciarlo el programa
casca. Así de primeras no parece que sea algo relacionado con un
problema de threads... pero ya lo he dicho, no tengo ni idea de Qt
(aunque sí de trabajar con bindings a librerías en C).

Para acotar el problema puedes intentar meter unos cuantos assert en
puntos estratégicos, por ejemplo:

contents = funcion_de_qt_que_devuelve_un_puntero_envuelto_en_python(.....)
assert contents, "te acabas de librar de un SEGENV, amigo"
# se le pasa la referencia a otra funcion de Qt
panel.drawContents(contents)

Siempre que se trabaje con librerías C envueltas (excepto las de la
librería estandar y unas pocas más) es conveniente sembrar bien el
código de asserts ya que a veces a los que han envuelto las librerías se
les escapa hacerlo internamente. Los asserts te lanzan una excepción
python (que siempre es más fácil de diagnosticar) en vez de dejar que el
error se propague otra vez a C lo cual siempre suele resultar en
desagradables SEGENVs.

Para depurar este tipo de errores puedes hacerte con un build de
depuración de python ("apt-get install python-dbg" en debian/ubuntu) o
compilarlo tu mismo para que la información que te da gdb sea más
precisa (también hay unos macros para gdb por ahí que te permiten
navegar por los frames de python desde gdb). También tendrás que
recompilar pyqt y demás librerías en C que no sean de la librería
estandar que estés usando en tu aplicación para linkarlas con el python
de depuración.

Saludos,
Alberto
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es