2010-08-05 17 views
6

Estoy escribiendo un complemento para una aplicación, de vez en cuando un SIGSEGV se descartaría. Sin embargo, la aplicación capta la señal SIGSEGV. En otras palabras, el plugin es una biblioteca dinámica. El error ocurre en mi plugin y biblioteca dinámica. Pero la aplicación maneja el sSIGSEGV y sale normalmente. Por lo tanto, es bastante difícil para mí depurar y obtener la traza inversa de todos los marcos de pila. ¿Alguna idea?Cómo depurar programa con controlador de señal para SIGSEGV

Actualmente estoy usando gdb como herramienta de depuración.

Respuesta

6

BGF se captura SIGSEGV antes de la aplicación hace.

Lo que describió en el comentario de la respuesta de Logan no tiene sentido.

Sospecho que lo que realmente está sucediendo es que la aplicación crea un nuevo proceso, y solo obtiene SIGSEGV en ese otro proceso, no en el que adjuntó GDB.

Los siguientes comandos pueden ser útiles si mi suposición es correcta:

(gdb) catch fork 
(gdb) catch vfork 
(gdb) set follow-fork-mode child 

Usted también puede editar y ampliar su pregunta:

  • , ¿cómo saber que hay es un SIGSEGV ¿para empezar?
  • Publicar un registro de su interacción con GDB también puede ser útil.
+0

Estás en lo correcto. Ciertamente, debería detectar el error del proceso secundario. Gracias. – Blad

+0

Lo intenté de acuerdo con su sugerencia, pero otro problema hizo abortar la aplicación: "shell-init: error al recuperar el directorio actual: getcwd: no puede acceder a los directorios principales: no existe dicho archivo o directorio". ¿Alguna idea? – Blad

4

Incluso si el programa atrapa SIGSEGV, gdb aún debe obtenerlo primero y darle la oportunidad de depurar el programa. ¿Has hecho algo como

handle SIGSEGV nostop 

en GDB? Si es así, eso podría ser por qué no se detiene.

¿Está seguro de que realmente se está produciendo un segfault? ¿Puedes duplicar este comportamiento con otro programa o intencionalmente causando una violación de segmentación?

Por ejemplo:

$ cat sig.c 
#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 

void handle(int n) 
{ 
     puts("Bail"); 
     exit(1); 
} 

int main() 
{ 
     signal(SIGSEGV, handle); 
     int *pi = 0; 
     *pi = 10; 
     return 0; 
} 
$ gcc -g sig.c 
$ ./a.out 
Bail 
$ gdb ./a.out 
GNU gdb 6.6-debian 
Copyright (C) 2006 Free Software Foundation, Inc. 
GDB is free software, covered by the GNU General Public License, and you are 
welcome to change it and/or distribute copies of it under certain conditions. 
Type "show copying" to see the conditions. 
There is absolutely no warranty for GDB. Type "show warranty" for details. 
This GDB was configured as "i486-linux-gnu"... 
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1". 
(gdb) run 
Starting program: /home/elcapaldo/a.out 

Program received signal SIGSEGV, Segmentation fault. 
0x08048421 in main() at sig.c:15 
15    *pi = 10; 
(gdb) where 
#0 0x08048421 in main() at sig.c:15 
(gdb) c 
Continuing. 
Bail 

Program exited with code 01. 
(gdb) q 
+0

Muchas gracias por su respuesta. No, en realidad, usé "manejar todo" y no funcionó. Incluso probé "manejar todos los nopass", la aplicación todavía atrapó SIGSEGV, y salió normalmente. – Blad

+0

Correcto, depuré de nuevo. Parecía que el bloqueo sucedió en un proceso folker. – Blad

Cuestiones relacionadas