Einen Stack Trace bereitstellen
|
Diese Seite wurde aus der früheren Fedora Wiki-Dokumentation übernommen. Der Text wurde für die Veröffentlichung hier im Fedora Docs Portal überarbeitet, aber noch nicht auf technische Korrektheit geprüft. Wahrscheinlich
Reviews for technical accuracy are greatly appreciated. If you want to help, see the README file in the source repository for instructions. Pull requests accepted at https://forge.fedoraproject.org/docs/quick-docs Sobald die Seite korrekturgelesen und korrigiert ist, entfernen Sie diese Notiz. |
Ein Stack Trace ist eine der wichtigsten Informationen, die Sie zur Fehlerbehebung bei einem Anwendungsabsturz bereitstellen können. Diese Seite erläutert die Bedeutung von Stack Traces und beschreibt verschiedene Methoden zu deren Erstellung.
Falls es zu einem Absturz kommt, sind die grundlegenden Schritte zur Erstellung eines aussagekräftigen Stack Traces für gängige Gnome-Desktopanwendungen folgende:
-
Installieren Sie die entsprechenden -debuginfo RPM-Pakete vor dem Absturz (siehe Abschnitt „Was sind Debuginfo-RPMs und wie erhalte ich sie?“ weiter unten).
-
Warten Sie, bis der Absturz eintritt, oder führen Sie die Schritte aus, die ihn reproduzieren.
-
ABRT (das „Automatic Bug Reporting Tool“) in Fedora erkennt den Absturz automatisch und erstellt einen Stack Trace.
-
Fügen Sie den Stack Trace in Ihren Fehlerbericht ein (vollständige Anweisungen finden Sie im Dokument Einen Fehler melden).
Falls ABRT nicht automatisch startet, müssen Sie das Programm auf spezielle Weise mithilfe eines Debuggers (z.B. gdb) starten. Siehe Abschnitt Einen Stack Trace nur mit GDB erhalten weiter unten.
Spezielle Anweisungen gelten für Java-Programme und Firefox.
Was ist ein Stack Trace (Backtrace)?
Ein Stack Trace (manchmal auch Backtrace genannt) ist eine Liste von Funktionsaufrufen, die zu einem bestimmten Punkt im Programm führt. Debugging-Werkzeuge wie gdb oder bugbuddy können Stack Traces von abgestürzten Anwendungen erfassen, sodass Entwickler die Fehlerursache ermitteln können.
Wie sieht ein Stack Trace aus?
Ein typischer Stack Trace sieht in etwa wie folgt aus:
[New Thread 8192 (LWP 15167)]
0x420ae169 in wait4 () from /lib/i686/libc.so.6
.
.
.
Ein besserer Backtrace mit Debuginfo-Symbolen (siehe unten) sieht folgendermaßen aus:
0x000000350a6c577f in *__GI___poll (fds=0xe27460, nfds=9, timeout=-1) at ../sysdeps/unix/sysv/linux/poll.c:83
83 return INLINE_SYSCALL (poll, 3, CHECK_N (fds, nfds), nfds, timeout);
.
.
.
Beachten Sie die Dateinamen und Zeilennummern der Stellen, an denen die Funktionen aufgerufen werden.
Was sind Debugging-Symbole und warum sind sie wichtig?
Wird ein Programm mit speziellen Optionen zur Erzeugung von Debug-Symbolen (Compiler-Option -g) kompiliert, werden zusätzliche Informationen in der Programmdatei gespeichert. Mithilfe dieser Informationen lässt sich ein Stack Trace generieren, der deutlich mehr Informationen enthält, beispielsweise die genaue Zeilennummer der Quelldatei, in der der Fehler aufgetreten ist. Ohne diese Informationen ist es sehr schwierig, die Fehlerursache allein anhand des Stack Traces zu ermitteln.
Was sind Debuginfo-RPMs und wie erhalte ich sie?
Fedora enthält spezielle RPM-Pakete, sogenannte Debuginfo-RPMs. Diese automatisch erstellten RPMs enthalten die Debugging-Informationen der Programmdateien, die in einer externen Datei gespeichert sind. Alle Werkzeuge, die Debugging-Informationen verarbeiten, können diese Dateien automatisch durchsuchen. So lassen sich Debugging-Informationen bei Bedarf einfach installieren. Sie müssen die exakt passende Version und Architektur von Debuginfo für die zu debuggende Anwendung installieren.
Beispiel: Überprüfung der Übereinstimmung von Version und Architektur
[warren@computer ~] $ rpm -q --qf '%{name}-%{version}-%{release}.%{arch}\n' gaim gaim-debuginfo
gaim-2.0.0-0.26.beta5.i386
gaim-debuginfo-2.0.0-0.26.beta5.i386
Jedes Paket mit Binärdateien in der Distribution verfügt über ein entsprechendes debuginfo-Paket.
Installation von Debuginfo-RPMs mit DNF
debuginfo-install ist ein praktisches Plugin aus dem Paket dnf-plugins-core, das die Debuginfo-Paketquellen automatisch aktiviert und alle benötigten Debuginfo-Pakete herunterlädt. Sie können Folgendes tun:
$ dnf debuginfo-install <Paketangabe>
um alle für das Paket <Paketangabe> benötigten Debuginfo-Pakete zu installieren.
Um nur die minimal erforderlichen Debuginfo-Pakete zu installieren, verwenden Sie die Paketliste des Befehls (ohne tatsächlich etwas zu installieren), um die Namen der Debuginfo-Pakete und ihre jeweiligen Paktequellen zu erhalten. Erstellen Sie dann den Installationsbefehl gemäß dem folgenden Beispiel:
$ dnf --enablerepo=fedora-debuginfo --enablerepo=updates-debuginfo install <Paketangabe>-debuginfo
Dies ist nützlich, wenn Sie nicht für alle Abhängigkeiten des zu debuggenden Pakets debuginfo-Pakete installieren möchten, da deren debuginfo-Pakete oft nicht erforderlich ist.
Installation von Debuginfo-RPMs mit yum
Das Werkzeug debuginfo-install ist Teil des Pakets yum-utils und aktiviert automatisch die Debuginfo-Paketquellen sowie alle benötigten Debuginfo-Pakete. Sie können Folgendes tun:
$ debuginfo-install foo
um alle für das Paket foo benötigten Debuginfo-Pakete zu installieren.
Um nur die minimal erforderlichen Debuginfo-Pakete zu installieren, verwenden Sie die Ausgabe von debuginfo-install (ohne tatsächlich etwas zu installieren), um die Namen der Debuginfo-Pakete und ihre jeweiligen Paketquellen zu ermitteln. Erstellen Sie anschließend den Installationsbefehl gemäß dem folgenden Beispiel:
$ yum --enablerepo fedora-debuginfo,updates-debuginfo install foo-debuginfo
Dies ist nützlich, wenn Sie nicht für alle Abhängigkeiten des zu debuggenden Pakets debuginfo-Pakete installieren möchten, da deren debuginfo-Pakete oft nicht erforderlich ist.
Debuginfo-RPMs manuell installieren
Diese Pakete können von den üblichen Fedora-Mirror-Servern im Unterverzeichnis „debug“ des Architekturverzeichnisses heruntergeladen werden. Beispielsweise sind die Debuginfo-Pakete für die neueste Entwicklungsversion unter https://mirrors.fedoraproject.org/publiclist/Fedora/development/ verfügbar. Bitte verwenden Sie zum Herunterladen den nächstgelegenen Mirror-Server.
Paketbetreuer
Wenn Sie als Paketbetreuer Informationen über Debuginfo-RPMs suchen, siehe Debuginfo-Pakete.
Wie generiere ich einen Backtrace?
Stellen Sie zunächst sicher, dass Sie die Debuginfo-Pakete für die zu debuggende Anwendung sowie alle zugehörigen Bibliotheken installiert haben. Entwickler empfehlen häufig die Installation bestimmter Debuginfo-Pakete, da sie anhand eines Stack Traces erkennen können, welche Bibliotheken am Absturz beteiligt sind. Nachfolgend finden Sie empfohlene Pakete für einige gängige Anwendungstypen.
Es gibt mehrere Möglichkeiten, einen Stack Trace zu erhalten:
-
Abrufen eines Stack-Traces mit Einen Stack Trace nur mit GDB erhalten.
-
Obtaining a stack trace from a core dump with GDB.
-
Obtaining a stack trace from an application using Automatic Bug Reporting Tool.
Welche Debuginfo-Pakete sollte ich installieren?
Sie müssen zumindest das Debuginfo-Paket für die abstürzende Anwendung installieren. Sie können herausfinden, in welchem Paket sich diese Anwendung befindet, indem Sie rpm -qf Pfad-zum-Programm eingeben.
Für bestimmte Programmtypen ist es außerdem sehr nützlich, einige Standardpakete zu installieren, die für nahezu alle Stack Traces hilfreich sind:
-
Gnome-Anwendungen und jene, die Gtk+ verwenden:
glib2-debuginfo, pango-debuginfo, gtk2-debuginfo -
KDE-Anwendungen:
qt-debuginfo, kdelibs-debuginfo
Einen Stack Trace nur mit GDB erhalten
|
Wenn Sie ein Java-Programm wie Eclipse oder Tomcat ausführen, ist die Situation etwas komplizierter – siehe Java-Programme für Details. |
Führen Sie zunächst folgenden Befehl aus, um gdb zu starten:
gdb Programmname
Hierbei ist der „Programmname“ der Name des Programms, das abgestürzt ist (zum Beispiel: /usr/bin/gnome-panel).
Geben Sie anschließend an der gdb-Eingabeaufforderung Folgendes ein:
run
Falls Sie dem Programm Argumente übergeben müssen, geben Sie diese nach dem Befehl „run“ an, zum Beispiel:
run --argument
Sobald das Programm läuft, reproduzieren Sie den Absturz und kehren Sie zum Terminal zurück, in dem Sie gdb ausgeführt haben. Die gdb-Eingabeaufforderung sollte angezeigt werden – falls nicht, drücken Sie Strg+C, um den Debugger zu starten. Geben Sie an der gdb-Debugger-Eingabeaufforderung Folgendes ein:
thread apply all bt full
Falls das nicht funktioniert (d.h., Sie erhalten keine Ausgabe – dies kann bei Programmen der Fall sein, die nicht multithreadfähig sind), geben Sie stattdessen <code>bt</code> ein. Sollten Sie weiterhin keine Ausgabe erhalten, lesen Sie bitte [[#special| diesen Hinweis]] zum Abrufen eines Stack Traces unter speziellen Umständen. Die Ausgabe ist der Stack Trace. Kopieren Sie diesen vollständig in eine Textdatei.
Sie können gdb beenden, indem Sie quit eingeben.
Manchmal kann der Stack Trace recht umfangreich sein und sich nur schwer kopieren und einfügen lassen. In solchen Fällen ist es praktisch, den Stack Trace in einer Datei zu speichern:
gdb
> run
# program crashes
> set logging file backtrace.log
> set logging on
> thread apply all bt full
> set logging off
> quit
Einen Stack-Trace aus einem Core-Dump gewinnen
Wenn das abstürzende Programm einen Core Dump erzeugt, können Sie mit GDB einen Stack Trace erstellen. Core Dumps werden in einer Datei auf Ihrer Festplatte gespeichert und tragen üblicherweise Namen wie „core“ oder „core.3124“. Um einen Stack Trace aus einer dieser Dateien zu erhalten, führen Sie folgenden Befehl aus:
gdb Programmname Name-des-Core-Dumps
Dabei ist Programmname der Name des abgestürzten Programms (zum Beispiel /usr/bin/gnome-panel) und Name-des-Core-Dumps der Name der Core-Datei, die den Core-Dump enthält (zum Beispiel core.7812).
Geben Sie anschließend an der gdb-Eingabeaufforderung Folgendes ein:
thread apply all bt full
If that does not work (meaning that you don’t get any output—this may be the case in programs which are not multi-threaded), type bt instead. If you still do not have any output, read this note about obtaining a stack trace under special circumstances. The output is the stack trace. Cut and paste all of it into a text file.
Sie können gdb beenden, indem Sie quit eingeben.
Beachten Sie, dass die Erstellung von Core-Dateien in Fedora standardmäßig deaktiviert ist (in /etc/profile). Um sie für eine Shell-Sitzung zu aktivieren, geben Sie an der Shell-Eingabeaufforderung Folgendes ein:
ulimit -c unlimited
Installation von ABRT
Wenn Sie Fedora über ein Live-CD-Abbild installiert haben, sollte ABRT bereits installiert sein. Sie können es unter „Anwendungen → System → Automatisches Fehlerberichtswerkzeug“ starten. Falls ABRT aus irgendeinem Grund nicht installiert ist, können Sie es manuell über die Befehlszeile installieren:
$ su -c 'dnf install abrt'
or go to System → Administration → Add/Remove Software in Gnome, and type`abrt` in the search box and select Find. Select the abrt package and apply the changes.
ABRT für Bugzilla einrichten
Go to Application → System Tools → Automated Bug Reporting Tool and select it to start it manually. Once the GUI window appears, choose Edit → Plugins and from the Settings window, scroll down, highlight Bugzilla and choose Configure Plugin. The Bugzilla URL should be https://bugzilla.redhat.com and enter your own Bugzilla login and password in the proper boxes.
|
Falls Sie noch kein Bugzilla-Konto besitzen, ist jetzt der richtige Zeitpunkt, sich eines anzulegen. Gehen Sie einfach auf die auf dieser Seite angezeigte URL und erstellen Sie ein neues Konto. |
Wenn Ihr Programm das nächste Mal abstürzt und ABRT ausgelöst wird, kann ABRT sich nach dem Klicken auf „Bericht“ automatisch bei Bugzilla anmelden und einen Fehlerbericht für Sie einreichen.
ABRT verwenden
(Im Folgenden wird Gnome als Desktop-Umgebung vorausgesetzt … für KDE/andere Desktop-Umgebungen muss es jemand anderes ergänzen.)
Wenn ABRT einen Programmabsturz erkennt, erhalten Sie eine ABRT-Warnung. Diese wird durch ein blinkendes rotes Licht in der Taskleiste angezeigt. Klicken Sie mit der linken Maustaste auf das Warnlicht. Daraufhin startet das automatische Fehlerberichtswerkzeug und zeigt alle registrierten Abstürze an. Um einen Fehler zu melden, klicken Sie mit der rechten Maustaste darauf und wählen Sie „Melden“. ABRT sammelt die benötigten Protokolle für die Fehlermeldung und benachrichtigt Sie anschließend, dass ein Fehlerbericht erstellt wird. Wenn Sie ABRT wie im vorherigen Abschnitt konfiguriert haben, werden Sie gefragt, ob die verschiedenen Protokolle beigefügt werden sollen. Anschließend wird automatisch ein Fehlerbericht in Bugzilla erstellt und die Protokolle werden an den Bericht angehängt. Die Bug-Nummer wird Ihnen angezeigt, sodass Sie den Bearbeitungsstatus des Fehlers verfolgen können.
ABRT konfigurieren, wenn Debug-Informationen fehlen
Wenn Sie in ABRT mit der rechten Maustaste auf einen Fehler klicken und „Bericht“ auswählen, versucht ABRT, die benötigten Protokolle für den Fehlerbericht abzurufen. Die Entwickler haben Code hinzugefügt, der erkennt, ob symbolische Traces im Backtrace enthalten sind. Falls keine vorhanden sind, erhalten Sie von ABRT eine entsprechende Benachrichtigung und den auszuführenden Befehl. Dies entspricht den Informationen im Abschnitt debuginfo.
Programme, die unter einem anderen Benutzer ausgeführt werden
Wenn Sie nach Eingabe von thread apply all bt oder bt keine Ausgabe von gdb erhalten, liegt das möglicherweise daran, dass das Programm als Root oder ein anderer Benutzer ausgeführt wird. Unter GNOME ist dies beispielsweise beim Ausführen von gnome-games der Fall. In solchen Fällen benötigen Sie Root-Rechte, um einen Stacktrace zu erfassen. Beenden Sie daher gdb, melden Sie sich als Root an und wiederholen Sie die Schritte, um einen Stacktrace zu erhalten.
Firefox
-
Installieren Sie die Firefox- und Xulrunner-Debug-Info-Pakete – führen Sie dazu
debuginfo-install firefox xulrunnerals Root in der Befehlszeile aus. -
Führen Sie
firefox -gin der Befehlszeile aus. Dadurch wird Firefox im gdb-Debugger gestartet. -
In gdb sollte die Eingabeaufforderung
(gdb)angezeigt werden. Geben Sie den Befehlrun -safe-modeein. Ein Dialogfenster wird angezeigt. Deaktivieren Sie hier alle Add-ons und fahren Sie im abgesicherten Modus fort. -
Tun Sie alles Notwendige, um Firefox zum Absturz zu bringen, und befolgen Sie die oben stehenden Anweisungen zur Verwendung von gdb.
-
When Firefox crashes, obtain the backtrace and attach it to bugzilla.
Weitere Informationen finden Sie in den Debugging-Richtlinien für Mozilla-Produkte.
Thunderbird
Es ist fast identisch mit Firefox, nur die Debug-Info-Pakete sind anders. Installieren Sie diese mit dem Befehl „debuginfo-install thunderbird“ als Root in der Konsole.
Weitere Informationen finden Sie in den Debugging-Richtlinien für Mozilla-Produkte.
Java-Programme
See document Troubleshooting Java Programs for info on getting stack traces from programs running in Java.
Daemons and their spawn
You will need to gather the backtrace from the core file.
Make sure your daemon’s initscript isn’t forbidding dumping core files to the disk. Add the line DAEMON_COREFILE_LIMIT=unlimited to its configuration file in /etc/sysconfig. For example, the Bluetooth daemon (hcid) uses /etc/sysconfig/bluetooth.
Then setup the kernel so that the core dump is written to a known location such as /tmp. As root, run:
echo /tmp/core > /proc/sys/kernel/core_pattern
To make this change permanent, add that line to /etc/sysctl.conf:
kernel.core_pattern = /tmp/core
And run sysctl -p to apply it straight away.
A full list of possible patterns for the core file are available at in the sysctl/kernel.txt kernel Documentation .
Finally, after reproducing your problem, you can double-check which binary created the core file with file /tmp/core.1234. Then run gdb on the file to create a post-mortem stack trace:
gdb /Pfad/zur/Binärdatei /tmp/core.1234
and follow the instructions above for gdb usage.
|
you can test whether dumping a core file would work by running |
Weitere Werkzeuge
Valgrind
The brilliant tool valgrind is often able to say more about what is going wrong; it can give a stack trace to the point where things start to go wrong, which might be long time before the program actually crashes. Programs run through valgrind will run an order of magnitude slower and use more memory, but it will be buddyamazingly usable.
With valgrind installed (`dnf install valgrind) you can use it on a program:
valgrind name-of-program program-arguments
With debuginfo installed stacktraces will use symbolic names. See [http://valgrind.org/ valgrind.org] for more info and tips and tricks.
strace
strace can track all system calls made by a program, which can also be helpful in debugging, though it cannot produce stack traces. Install with dnf install strace, and see man strace for details.
The situation is a bit improved. Now stack trace feature is implemented (strace -k). Though it is disabled when building because the implementation is not stable on i386.
Referenzen
-
Much of the text from this page comes from the excellent GNOME bugsquad on getting stack traces.
Want to help? Learn how to contribute to Fedora Docs ›