11 Stimmen

Linux: Wie debuggt man einen SIGSEGV? Wie kann ich die Fehlerquelle zurückverfolgen?

Mein Firefox stürzt seit heute ab. Ich habe nichts am System oder an der Firefox-Konfiguration geändert.

Ich benutze
strace -ff -o dumpfile.txt firefox
um das Problem aufzuspüren. Das ist keine große Hilfe.

Ich sehe den Segfault in zwei der generierten Prozessdumps, aber wie kann ich Spur sie für ihre Sache zu gewinnen?

Nachdem es 10 Sekunden lang gelaufen ist, stürzt es ab, 22 MB an Daten von strace erzeugt.

Dies ist ein Ausschnitt aus der Ausgabe, in dem Sie SIGSEGV in der Mitte sehen können:

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

25voto

Rom Punkte 4053

Ivan, deine eigentliche Frage lautet: "Wie debugge ich einen SIGSEGV?"

strace ist hier selten eine gute Hilfe. SIGSEGV bedeutet, dass die Anwendung versucht hat, eine Stelle im Speicher zu dereferenzieren (darauf zuzugreifen), die nicht zugewiesen wurde (oder aus verschiedenen anderen Gründen nicht dereferenziert werden darf). Die Wahrscheinlichkeit ist groß, dass dies nicht mit der Aktivität der Systemaufrufe zusammenhängt, die von strace aufgezeichnet werden. Um die Ursache Ihres Absturzes herauszufinden, müssen Sie zunächst verstehen, welche Adresse dereferenziert wird und welche Funktion versucht, dies zu tun. Der Debugger ist das richtige Werkzeug für diese Aufgabe.

Das müssen Sie tun:

 gdb <your_app_name> <your_coredump_file>

Dort analysieren Sie die zuletzt ausgeführte Anweisung und mit "info registers" sehen Sie die betreffende Adresse. Mit dem Befehl "bt" können Sie den Aufrufstapel sehen. Wenn Sie den Aufrufstapel durchgehen, werden Sie feststellen, wie die falsche Adresse berechnet wird. Einer der Schritte, die an dieser Adressberechnung beteiligt sind, ist die Ursache für Ihr Problem.

Debugging macht Spaß, und dies ist eine gute Gelegenheit, sich damit zu beschäftigen. Ein gutes Buch oder einige Online-Artikel können Ihnen dabei helfen. Googeln Sie los und viel Glück!

8voto

codeDr Punkte 1397

Damit können Sie den Firefox im Debug-Modus starten: firefox -d gdb

Dies wird Firefox innerhalb von gdb starten.

Sie können den gdb-Befehl 'run' ausführen und einen Traceback erhalten, wenn Firefox abstürzt. Dies kann schwierig sein, da Firefox mit gestrippten Bibliotheken ausgeliefert wird, die nur zeigen, welche Bibliothek und den Offset des Codes anzeigt, nicht aber die Funktionsnamen.

Eine andere Alternative ist, Firefox im Sicherheitsmodus zu starten: firefox -safe-mode und deaktivieren Sie alle Plugins, die Sie installiert haben, bis er nicht mehr abstürzt.

Die letzte Möglichkeit besteht darin, den Entwicklermodus von Firefox zu aktivieren und ihm zu erlauben, die die Firefox-Absturzsitzung an den Mozilla-Server zu senden. Dann können Sie auf die Mozilla-Website gehen gehen und den detaillierten Traceback Ihrer fehlgeschlagenen Firefox-Sitzung sehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X