2009-06-21 3 views
7

Mon firefox a commencé à s'écraser depuis aujourd'hui. Je n'ai rien changé sur le système ou sur config firefox.Linux: Comment déboguer un SIGSEGV? Comment puis-je suivre la source de l'erreur?

J'utilise
strace -ff -o dumpfile.txt firefox
pour tracer le problème. Ce n'est pas une grosse aide.

Je vois le segfault, dans deux des décharges de processus générées, mais comment puis-je trace leur à leur cause? Après une exécution de 10 secondes et une panne, 22 Mo de données sont générées par strace.

C'est un extrait de la sortie, où vous pouvez voir SIGSEGV réelle au milieu .:

 
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 

Répondre

20

Ivan, votre vraie question est « comment puis-je déboguer un SIGSEGV? »

strace est rarement une bonne aide ici. SIGSEGV signifie que l'application a essayé de déréférencer (accéder) un emplacement en mémoire qui n'a pas été attribué (ou qui ne peut pas être déréférencé pour diverses autres raisons). Les chances sont élevées que cela ne soit pas lié à l'activité des appels système que strace capture. Afin de découvrir la cause de votre accident, commencez par comprendre quelle adresse est déréférencée et quelle fonction essaie de le faire. Le débogueur est le bon outil pour cette tâche.

Voici ce que vous devez faire:

gdb <your_app_name> <your_coredump_file> 

là, l'analyse de la dernière instruction exécutée et l'utilisation de « info enregistre », vous verrez l'adresse en question. En utilisant la commande "bt" vous verrez la callstack. En remontant la pile, vous découvrirez comment l'adresse incorrecte est calculée. Une des étapes impliquées dans ce calcul d'adresse est la cause de votre problème.

Déboguer est amusant et c'est une bonne occasion de s'y plonger. Un bon livre ou des articles en ligne peuvent vous y aider. Google loin et bonne chance!

+0

Qu'est-ce qu'un fichier core dump et comment puis-je le générer? – Craig

7

Vous pouvez démarrer Firefox en mode débogage avec ceci: firefox -d gdb

cela va commencer à Firefox gdb.

Vous pouvez émettre la commande gdb 'run' et obtenir une traceback lorsque firefox se bloque. Cela peut être difficile, car firefox est livré avec des librairies dénudées qui ne montre que la bibliothèque et le code du décalage, pas les noms des fonctions. Une autre alternative est de démarrer firefox en mode de sécurité: firefox -safe-mode et de désactiver tous les plugins que vous avez installés jusqu'à ce qu'il ne plante plus.

La dernière alternative est d'activer le mode développeur de firefox, et lui permettre d'envoyer la session de crash firefox au serveur mozilla. Ensuite, vous pouvez aller sur le site mozilla et voir le retraçage détaillé de votre session firefox échouée.

Questions connexes