2009-06-21 19 views
7

Il mio firefox ha iniziato a bloccarsi da oggi. Non ho cambiato nulla sul sistema o su firefox config.Linux: come eseguire il debug di un SIGSEGV? Come posso rintracciare la fonte dell'errore?

Io uso
strace -ff -o dumpfile.txt firefox
per rintracciare il problema. Non è un grande aiuto.

Vedo il segfault, in due dei dump di processo generati, ma come posso rintracciare alla loro causa?

Dopo l'esecuzione per 10 secondi e arresto anomalo, 22 MB di dati viene generato da strace.

Si tratta di un frammento di uscita, dove si possono vedere SIGSEGV effettiva nel mezzo .:

 
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 

risposta

20

Ivan, la tua vera domanda è "come faccio il debug di un SIGSEGV?"

strace raramente è un buon aiuto qui. SIGSEGV significa che l'applicazione ha tentato di dereferenziare (accedere) a una posizione in memoria che non è stata allocata (o non è consentita la reindirizzamento per altri motivi). È probabile che non sia correlato all'attività delle chiamate di sistema che sta catturando strace. Per scoprire la causa del crash, inizia a capire quale indirizzo viene sottoposto a dereferenziazione e quale funzione cerca di farlo. Il debugger è lo strumento giusto per questa attività.

Ecco cosa dovete fare:

gdb <your_app_name> <your_coredump_file> 

in là, analizzando l'ultima istruzione eseguita e l'utilizzo di "informazioni registra" vedrete l'indirizzo in questione. Usando il comando "bt" vedrai il callstack. Avvicinandoti al callstack, scoprirai come viene calcolato l'indirizzo errato. Uno dei passaggi coinvolti in questo calcolo dell'indirizzo è la causa del tuo problema.

Il debug è divertente e questa è una buona opportunità per approfondire. Un buon libro o alcuni articoli online possono aiutarti. Google via e buona fortuna!

+0

che cos'è un file di dump di base e come lo si genera? – Craig

7

è possibile avviare Firefox in modalità di debug con questo: firefox -d gdb

questo inizierà firefox all'interno gdb.

È possibile emettere il comando gdb "esegui" e ottenere un traceback quando firefox si arresta in modo anomalo. Questo può essere difficile, dato che firefox viene fornito con librerie stripped che mostra solo la libreria e l'offset del codice, non i nomi delle funzioni.

Un'altra alternativa è quella di avviare Firefox in modalità provvisoria: firefox -safe-mode e spegnere tutti i plugin che si può avere installato fino a quando non va in crash più.

L'ultima alternativa è abilitare la modalità sviluppatore di firefox e consentire di inviare la sessione di arresto firefox al server mozilla. Quindi puoi visitare il sito di mozilla e vedere il traceback dettagliato della tua sessione di firefox fallita.