2009-06-21 10 views
7

Mi firefox comenzó a fallar desde hoy. No he cambiado nada en el sistema ni en las configuraciones de Firefox.Linux: ¿cómo depurar un SIGSEGV? ¿Cómo rastrear el origen del error?

utilizo
strace -ff -o dumpfile.txt firefox
de rastrear el problema. No es una gran ayuda.

veo la violación de segmento, en dos de los vertederos de proceso generado, pero ¿cómo puedo traza a su causa?

Después de funcionar durante 10 segundos y estrellarse, 22 MB de datos es generado por strace.

Este es un fragmento de la salida, donde se puede ver SIGSEGV real en el medio .:

 
read(19, "\372", 1)      = 1 
gettimeofday({1245590019, 542231}, NULL) = 0 
read(3, "\6\0[Qmy\26\0\3\1\0\0Y\0\200\2\0\0\0\0\323\3A\0\323\3(\0\20\0\1\0", 4096) = 32 
read(3, 0xf5c55058, 4096)    = -1 EAGAIN (Resource temporarily unavailable) 
gettimeofday({1245590019, 542813}, NULL) = 0 
poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=8, events=POLLIN|POLLPRI}, {fd=12, events=POLLIN|POLLPRI}, {fd=13, events=POLLIN|POLLPRI}, {fd=14, events=POL 
read(3, 0xf5c55058, 4096)    = -1 EAGAIN (Resource temporarily unavailable) 
gettimeofday({1245590019, 543161}, NULL) = 0 
gettimeofday({1245590019, 546672}, NULL) = 0 
gettimeofday({1245590019, 546761}, NULL) = 0 
read(3, 0xf5c55058, 4096)    = -1 EAGAIN (Resource temporarily unavailable) 
gettimeofday({1245590019, 546936}, NULL) = 0 
poll([{fd=4, events=POLLIN}, {fd=3, events=POLLIN}, {fd=8, events=POLLIN|POLLPRI}, {fd=12, events=POLLIN|POLLPRI}, {fd=13, events=POLLIN|POLLPRI}, {fd=14, events=POL 
poll([{fd=3, events=POLLIN|POLLOUT}], 1, 4294967295) = 1 ([{fd=3, revents=POLLOUT}]) 
writev(3, [{"5\30\4\0006\21\200\2\266\n\200\2\17\0]\3\230\4\5\0007\21\200\0026\21\200\2\317\0\0\0"..., 1624}, {NULL, 0}, {"", 0}], 3) = 1624 
poll([{fd=3, events=POLLIN}], 1, 4294967295) = 1 ([{fd=3, revents=POLLIN}]) 
read(3, "\1\30\224Q\17\17\0\0\0\0\0\0\0\0\0\0000\235\273\0\0\0\0\0o\264Q\0\0\0\0\0"..., 4096) = 4096 
read(3, "\375\240f\0\376\242j\0\377\261\200\0\271a+\0\271a+\0\377\261\200\0\376\252w\0\376\250s\0"..., 11356) = 11356 
read(3, 0xf5c55058, 4096)    = -1 EAGAIN (Resource temporarily unavailable) 
poll([{fd=3, events=POLLIN|POLLOUT}], 1, 4294967295) = 1 ([{fd=3, revents=POLLOUT}]) 
writev(3, [{"\230\32\7\0\1\21\200\2?\21\200\2\377\377\377\377\377\377\377\377\0\0\0\0\17\0\1\0015\10\4\0"..., 956}, {NULL, 0}, {"", 0}], 3) = 956 
poll([{fd=3, events=POLLIN}], 1, 4294967295) = 1 ([{fd=3, revents=POLLIN}]) 
read(3, "\1\30\256Q\17\17\0\0\0\0\0\0\0\0\0\0000\235\273\0\0\0\0\0o\264Q\0\0\0\0\0"..., 4096) = 4096 
read(3, "\375\240f\0\376\242j\0\377\261\200\0\271a+\0\271a+\0\377\261\200\0\376\252w\0\376\250s\0"..., 11356) = 11356 
read(3, 0xf5c55058, 4096)    = -1 EAGAIN (Resource temporarily unavailable) 
--- SIGSEGV (Segmentation fault) @ 0 (0) --- 
unlink("/home/userrrr/.mozilla/firefox/mvbnkitl.default/lock") = 0 
rt_sigaction(SIGSEGV, {SIG_DFL, ~[HUP INT QUIT ABRT BUS FPE KILL PIPE CHLD CONT TTOU URG XCPU WINCH RT_1 RT_2 RT_3 RT_4 RT_8 RT_11 RT_14 RT_17 RT_22], SA_NOCLDSTOP}, 
rt_sigprocmask(SIG_BLOCK, ~[ILL ABRT BUS FPE SEGV RTMIN RT_1], ~[KILL STOP RTMIN RT_1], 8) = 0 
open("/home/userrrr/.mozilla/firefox/mvbnkitl.default/minidumps/56b30367-5ee2-0495-32646b7f-59dc87e9.dmp", O_WRONLY|O_CREAT|O_EXCL, 0600) = 63 
clone(child_stack=0xf5bfffe4, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_UNTRACED) = 18929 
waitpid(18929, NULL, __WALL) = 18929 
open("/proc/18913/task", O_RDONLY|O_NONBLOCK|O_LARGEFILE|O_DIRECTORY|O_CLOEXEC) = 64 
fstat64(64, {st_mode=S_IFDIR|0555, st_size=0, ...}) = 0 
getdents64(64, /* 12 entries */, 1024) = 368 
ptrace(PTRACE_DETACH, 18913, 0, SIG_0) = -1 ESRCH (No such process) 
close(64)        = 0 
ftruncate(63, 91256)     = 0 
close(63)        = 0 
rt_sigprocmask(SIG_SETMASK, ~[KILL STOP RTMIN RT_1], ~[KILL STOP RTMIN RT_1], 8) = 0 
time(NULL)        = 1245590020 
open("/home/userrrr/.mozilla/firefox/Crash Reports/LastCrash", O_WRONLY|O_CREAT|O_TRUNC, 0600) = 63 
write(63, "1245590020", 10)    = 10 

Respuesta

20

Iván, su verdadera pregunta es "¿cómo puedo depurar un SIGSEGV?"

strace rara vez es una buena ayuda aquí. SIGSEGV significa que la aplicación intentó desreferenciar (acceder) a una ubicación en la memoria que no ha sido asignada (o que no permite su desreferenciación por varias otras razones). Hay muchas posibilidades de que no esté relacionado con la actividad de llamadas al sistema que strace está capturando. Para descubrir la causa de su bloqueo, comience por comprender qué dirección se desreferencia y qué función intenta hacer eso. El depurador es la herramienta correcta para esta tarea.

Esto es lo que hay que hacer:

gdb <your_app_name> <your_coredump_file> 

ahí, el análisis de la última instrucción ejecutada y el uso de "información registra" verá la dirección en cuestión. Usando el comando "bt" verás la pila de llamadas. Al subir la escala de llamadas, descubrirá cómo se calcula la dirección incorrecta. Uno de los pasos involucrados en este cálculo de dirección es la causa de su problema.

La depuración es divertida y esta es una buena oportunidad para profundizar en ella. Un buen libro o algunos artículos en línea pueden ayudarlo allí. ¡Fuera de Google y buena suerte!

+0

¿Qué es un archivo de volcado de núcleo y cómo lo genero? – Craig

7

Puede arranque Firefox en modo de depuración con esto: Firefox -d GDB

Esto iniciará Firefox dentro de gdb.

Puede ejecutar el comando gdb 'ejecutar' y obtener un rastreo cuando Firefox se cuelga. Esto puede ser difícil, ya que Firefox se envía con bibliotecas depuradas que solo muestra qué biblioteca y en qué offset se encuentra el código, no los nombres de las funciones.

Otra alternativa es iniciar firefox en modo seguro: firefox -safe-mode y desactivar los complementos que pueda haber instalado hasta que no se bloquee más.

La última alternativa es habilitar el modo desarrollador de firefox y permitirle enviar la sesión de bloqueo de Firefox al servidor mozilla. Luego puede ir al sitio de mozilla y ver el rastreo detallado de su sesión fallida de Firefox.

Cuestiones relacionadas