Depurar una señal SIGPIPE de una biblioteca de terceros

Estoy depurando una aplicación Qt-3 significativamente grande. La aplicación realiza mucho preprocesamiento y luego recibe una señal SIGPIPE. Estoy escribiendo algunas entradas del backtrace tan pronto como obtengo SIGPIPE.

#0 .. __write_nocancel () from libpthread.so
#1 .. _IceTransFreeConnInfo () from libICE.so.6
#2 .. _IceWrite () from libICE.so.6
#3 .. _IceFlush () from libICE.so.6

Nuestra aplicación tiene un manejador de señales. Lo que hice fue ignorar SIGPIPE usando signal(SIGPIPE, SIG_IGN), pensando que mi aplicación continuará incluso si recibo esta señal. Pero ahora me doy cuenta de que no funcionará de esa manera, solo existe si continúo después de recibir SIGPIPE.

No tengo ni idea de cómo depurar este problema. Esta señal no se origina en una llamada de socket directamente por nuestra aplicación. Viene de libICE. ¿Estoy en lo correcto? Por favor, dé algunas sugerencias sobre cómo depurar esto.

gracias por adelantado.

preguntado el 02 de febrero de 12 a las 11:02

Cuando la propia aplicación raise()es la señal, debería poder captarla en un depurador. -

@PlasmaHH: ¿Quién dijo algo sobre raise()? -

1 Respuestas

La señal proviene del kernel y es el resultado de write(2)a un descriptor de archivo, por el cual el receptor ha muerto, o ha ejecutado un shutdown(2).

Parece que algo en su código estropeó un descriptor de archivo que pertenece a libICE.so, y no a ti.

Su primer paso probablemente debería ser ejecutar la aplicación bajo strace, y luego analice el registro para ver exactamente cómo el FD en qué libICE Se ha estropeado la escritura.

Una vez que sepa lo que está sucediendo, use GDB catch syscall comando para averiguar dónde esta pasando.

Respondido 04 Feb 12, 02:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.