Hi all, Einen weiteren Crash meines KDE-Kickers mächte ich einmal zum Anlaß nehmen, eine grundlegende Frage zu stellen: Kann mir einer erklären, wie ich mir das mit der Rückverfolgung eines Crashs vorzustellen habe? Wie funktioniert das denn? (Ausnahmsweise hat sich ganz kurz nach dem Crash der Crash-Manager gemeldet). Wenn er sagt, no debugging symbols found, dann heißt das, das der verwendete Code keine Debugging-Informationen enthält (die kann man mitkompilieren). Warum aber gibt es dann trotzdem noch Informationen? Und wie aussagekräftig sind sie? Helga -- ~~~~~~~~~~~~~~~~~~~~~~Wer macht mit?~~~~~~~~~~~~~~~~~~~~~ Das dt. Dokumentationsprojekt von OpenOffice.org sucht Mitstreiter # Projekt-Einstieg: http://lang.openoffice.org/de # Mailingliste: http://lang.openoffice.org/de/about-mailinglist.html
Hallo, sorry falls irgendwas schief geht, ich kopier das hier aus dem
Archiv zusammen...
Helga Fischer
Kann mir einer erklären, wie ich mir das mit der Rückverfolgung eines Crashs vorzustellen habe? Wie funktioniert das denn?
Naja, sagt dir der Begriff 'stack' etwas? Achtung: alles nur IIRC, ich bitte um Korrekturen! Also, wenn ein Programm ablaueft, dann werden i.a. ja mehr oder weniger viele Funktionen aufgerufen, und deren Adressen sowie (die Adressen) deren lokale Variablen landen eben dort, auf dem "Stack". Ein "Stack" ist ein "Stapel", du kannst oben was drauflegen, und von oben wieder runternehmen... Der sog. "Stack-Backtrace" baut also quasi den Stapel komplett ab, und ist somit i.A. von hinten/unten zu lesen, um herauszufinden was/von wo aufgerufen wurde... Nun kommt das folgende ins Spiel:
Wenn er sagt, no debugging symbols found, dann heißt das, das der verwendete Code keine Debugging-Informationen enthält (die kann man mitkompilieren). Warum aber gibt es dann trotzdem noch Informationen?
Naja, es gibt eben die Info's, die zur Laufzeit verfuegbar sind, also z.B. eben die Adressen von Funktionen und Variablen. Das hilft einem aber nur relativ wenig. Zum Kernel gibt's dafuer die System.map, die diese Adressen einem Namen zuordnet, bei Programmen muessen die Symbolnamen in das binary einkompiliert werden (d.h. kein "strip"!). Dann kann der Backtrace die Symbolnamen mit ausgeben. Zum debuggen selbst sind allerdings noch mehr Infos noetig (die mit dem flag '-g' mit einkompiliert werden koennen), damit sich der debugger zurechtfindet...
Und wie aussagekräftig sind sie?
Sehr, wenn man auch die Quellen vorliegen hat ;)
Bei KDE wuerde ich mir aber als nicht-KDE-Anwender keinen Kopp
drum machen, dazu sind u.a. zu viele libs beteiligt, soll heissen, die
Komplexitaet ist enorm und der Aufwand den Fehler zu lokalisieren
ebenso. Und leider sind (kleinere) Unsauberkeiten bei den GUIs leider
normal, kompiliere mal ne KDE/GTK-App mit '-Wall -W', vieles was dann
der gcc als Warnings ausspuckt funktioniert oder ist sogar richtig,
aber eben _nicht_ alles ;(
Was mir z.B. (ich versuch grad gtk2 zu kompilieren mal wieder) am
meisten auffaellt, ist dass mit der "signedness" von Variablen
ziemlich rumgeschlampt wird, was sich vereinzelt bis in die libc und
den Kernel zieht... Tja, und wenn man signed und unsigned vergleicht
(z.B.) sind die Resultate nur bedingt deterministisch.
Kompiliere mal z.B:
,----[ /tmp/test/signedness.c ]
| #include
On Sat, 01 Jun 2002 at 03:52 (+0200), David Haller wrote:
Helga Fischer
wrote: Kann mir einer erklären, wie ich mir das mit der Rückverfolgung eines Crashs vorzustellen habe? Wie funktioniert das denn?
Naja, sagt dir der Begriff 'stack' etwas?
Achtung: alles nur IIRC, ich bitte um Korrekturen!
Also, wenn ein Programm ablaueft, dann werden i.a. ja mehr oder weniger viele Funktionen aufgerufen, und deren Adressen sowie (die Adressen) deren lokale Variablen landen eben dort, auf dem "Stack".
Ein "Stack" ist ein "Stapel", du kannst oben was drauflegen, und von oben wieder runternehmen... Der sog. "Stack-Backtrace" baut also quasi den Stapel komplett ab, und ist somit i.A. von hinten/unten zu lesen, um herauszufinden was/von wo aufgerufen wurde... Nun kommt das folgende ins Spiel:
In dem Zusammenhang recht interessant ist der c't-Artikel "Das Sicherheitsloch", Buffer-Overflows und wie man sich davor schützt, c't 23/2001, S. 216, v. Stephan Kallnik, Daniel Pape, Daniel Schröter, Stefan Strobel (ju). Ansonsten: Das mit dem signed/unsigned-Vergleich war mir auch neu. Allerdings würde ich nie eine Warnung des Compilers einfach so ignorieren (außer vielleicht über ungenutzte Variablen) und dem Grund nachgehen. Das scheint bei vielen KDE-/GNOME-Programmierern aber nicht so sein, oft sind die anscheinend der Meinung "es funktioniert ja". Nur irgendwann kracht's halt dann doch ... Mir ist schon oft aufgefallen, dass ältere Programme (auch GUI!) ohne irgendwelche Warnungen durchkompilieren, obwohl es wahscheinlich um ein Vielfaches komplizierter ist, mit Motif oder gar Athena ein GUI-Programm zu entwickeln als mit Gtk+ oder QT/KDE. Gruß, Bernhard -- The feature you'd like to have is probably already installed on your Linux system.
Am Samstag, 1. Juni 2002 11:21 schrieb Bernhard Walle:
In dem Zusammenhang recht interessant ist der c't-Artikel "Das Sicherheitsloch", Buffer-Overflows und wie man sich davor schützt, c't 23/2001, S. 216, v. Stephan Kallnik, Daniel Pape, Daniel Schröter, Stefan Strobel (ju).
Der Artikel ist wirklich gut, kann ich nur empfehlen.
Ansonsten: Das mit dem signed/unsigned-Vergleich war mir auch neu. Allerdings würde ich nie eine Warnung des Compilers einfach so ignorieren (außer vielleicht über ungenutzte Variablen) und dem Grund nachgehen. Das scheint bei vielen KDE-/GNOME-Programmierern aber nicht so sein, oft sind die anscheinend der Meinung "es funktioniert ja". Nur irgendwann kracht's halt dann doch ...
Na Bernhard, wenn Du mal nicht auf die Desktop-Umgebungen rumhacken könntest ... Na, aber so unrecht hast Du nicht. Scheint aber ein Problem vieler grosser Pakete zu sein. Wenn ich für jedes Warning beim Mozilla-Compile nen Cent kriegen würde, könnte ich Montag meinen Job hinschmeissen und auch die Kernelcompilierung (2.4.19-pre9 mit dem neuen gcc 3.1.1) bringt massenweise Warnings zu Tage (hauptsächlich deprecated Warnings, also eigentlich unkritisch, aber doch vorhanden). Ich könnte mir vorstellen, dass bei OOo die Sache ähnlich aussieht.
Mir ist schon oft aufgefallen, dass ältere Programme (auch GUI!) ohne irgendwelche Warnungen durchkompilieren, obwohl es wahscheinlich um ein Vielfaches komplizierter ist, mit Motif oder gar Athena ein GUI-Programm zu entwickeln als mit Gtk+ oder QT/KDE.
Die Entwicklungszyklen scheinen mittlerweile doch ein bisserl zu kurz zu sein, kaum ist eine Version raus, steht die nächste auf der Tür. PS: Ja ich bin auch auf der Liste, es bleibt euch nicht erspart ;-) -- Machs gut | http://www.iiv.de/schwinde/buerger/tremmel/ Manfred | http://www.knightsoft-net.de
On Sat, 01 Jun 2002 at 13:30 (+0200), Manfred Tremmel wrote:
Am Samstag, 1. Juni 2002 11:21 schrieb Bernhard Walle:
Ansonsten: Das mit dem signed/unsigned-Vergleich war mir auch neu. Allerdings würde ich nie eine Warnung des Compilers einfach so ignorieren (außer vielleicht über ungenutzte Variablen) und dem Grund nachgehen. Das scheint bei vielen KDE-/GNOME-Programmierern aber nicht so sein, oft sind die anscheinend der Meinung "es funktioniert ja". Nur irgendwann kracht's halt dann doch ...
Na Bernhard, wenn Du mal nicht auf die Desktop-Umgebungen rumhacken könntest ...
Äh, wieso, ich habe nichts gegen Desktopumgebungen. Ich benutze doch selber KDE 3. Und ich muss sogar sagen, dass KDE 3 recht gut gelungen ist, wenn ich da an KDE 2 am Anfang denke ...
Na, aber so unrecht hast Du nicht. Scheint aber ein Problem vieler grosser Pakete zu sein. Wenn ich für jedes Warning beim Mozilla-Compile nen Cent kriegen würde, könnte ich Montag meinen Job hinschmeissen und auch die Kernelcompilierung
Mozilla habe ich selber noch nicht kompiliert. Soweit ich mich aber an QT3 erinnern kann, ist das recht fehlerfrei durchgelaufen, obwohl es sich auch um ein großes Projekt handelt.
(2.4.19-pre9 mit dem neuen gcc 3.1.1) bringt massenweise Warnings zu Tage (hauptsächlich deprecated Warnings, also eigentlich unkritisch, aber doch vorhanden).
Das liegt aber dann wohl eher daran, dass man bisher mit dem gcc2.xx gearbeitet hat und jetzt mit der Anpassung auf den gcc3 beschäftigt ist. Natürlich: Mit sauberem ANSI-C wäre das nicht passiert ... ;-)
Mir ist schon oft aufgefallen, dass ältere Programme (auch GUI!) ohne irgendwelche Warnungen durchkompilieren, obwohl es wahscheinlich um ein Vielfaches komplizierter ist, mit Motif oder gar Athena ein GUI-Programm zu entwickeln als mit Gtk+ oder QT/KDE.
Die Entwicklungszyklen scheinen mittlerweile doch ein bisserl zu kurz zu sein, kaum ist eine Version raus, steht die nächste auf der Tür.
Release early, release often ist meiner Meinung nach grundsätzlich der richtige Weg. Allerdings wird meiner Meinung nach eine Version zu schnell als "stable" freigegeben, v. a. bei KDE. Mozilla ist da schon besser und bei KDE scheint man sich auch gebessert zu haben.
PS: Ja ich bin auch auf der Liste, es bleibt euch nicht erspart ;-)
Ich hab's befürchtet ... *g* Gruß, Bernhard -- * Linux Viruscan..... Windows 95 found. Remove it? (y/n)
Am Samstag, 1. Juni 2002 13:37 schrieb Bernhard Walle:
On Sat, 01 Jun 2002 at 13:30 (+0200), Manfred Tremmel wrote:
Na Bernhard, wenn Du mal nicht auf die Desktop-Umgebungen rumhacken könntest ...
Äh, wieso, ich habe nichts gegen Desktopumgebungen. Ich benutze doch
Ok es ist wohl primär Bernd Brodesser, der KDE auf dem Kicker (;-)) hat, da hab ich euch wohl wieder mal durcheinander gebracht.
selber KDE 3. Und ich muss sogar sagen, dass KDE 3 recht gut gelungen ist, wenn ich da an KDE 2 am Anfang denke ...
Die 3.0.1 ist echt ein gutes Stück Software geworden, die 3.0 hatte auch ihre Kinerkrankheiten, aber bei einer .0 stand das ja zu erwarten. Die 2.0er hab ich mir erstmals mit der 1.90 (Beta1) angesehen und ja, das war wirklich ein Abenteuer ;-)
Mozilla habe ich selber noch nicht kompiliert. Soweit ich mich aber an QT3 erinnern kann, ist das recht fehlerfrei durchgelaufen, obwohl es sich auch um ein großes Projekt handelt.
Für mein PowerBook bleibt mir meist nichts anders übrig als Mozilla selbst zu compilieren, SuSE stellt immer nur die i386.rpms zur Verfügung und die Source-RPMs (liefen bisher aber immer problemlos durch). Hm, die QT hab ich seit 2.2.3 nicht mehr selber compiliert, auch wenns mich jetzt mit dem gcc 3.1.1 wieder jucken würde, wie viel man da rausholen kann, bei xine hab ich nur noch mit den Ohren geschlackert, wie viel sich da doch getan hat :-)
(2.4.19-pre9 mit dem neuen gcc 3.1.1) bringt massenweise Warnings zu Tage (hauptsächlich deprecated Warnings, also eigentlich unkritisch, aber doch vorhanden).
Das liegt aber dann wohl eher daran, dass man bisher mit dem gcc2.xx gearbeitet hat und jetzt mit der Anpassung auf den gcc3 beschäftigt ist. Natürlich: Mit sauberem ANSI-C wäre das nicht passiert ... ;-)
Ich gebs zu, das war ein bisschen Unfair. Gerade im Kernel wird ja gern um gewisse compilerbugs rumprogrammiert und das ist dann natürlich bei so nem gravierenden Einschnitt wie dem gcc-sprung von 2.x -> 3.0 -> 3.1 heikel. Gerade in den 2.4.19er Pre-Kerneln wird je da heftig gedreht (wenn man die Changelogs so anschaut), der 2.4.18er lies sich hier noch gar nicht mit dem 3.1.1er gcc compilieren.
Die Entwicklungszyklen scheinen mittlerweile doch ein bisserl zu kurz zu sein, kaum ist eine Version raus, steht die nächste auf der Tür.
Release early, release often ist meiner Meinung nach grundsätzlich der richtige Weg. Allerdings wird meiner Meinung nach eine Version zu schnell als "stable" freigegeben, v. a. bei KDE. Mozilla ist da schon besser und bei KDE scheint man sich auch gebessert zu haben.
Das stimmt wohl. Mozilla ist da ja wirklich unbeirrbar, wenn man bedenkt, wie früh Netscape da eine 6.0 draus gebastelt hat. Aber Mozilla brauchte den Reifungsprozess auch dringene, der Schnitt 0.9 -> 0.9.1 hat ja deutlich mehr speed gebracht, aber sonst lief da nicht mehr allzuviel, das hat dann halt gedauert, bis speed, stabilität und funktion gepasst hat. Die 1.0rcX lassen ja hoffen.
PS: Ja ich bin auch auf der Liste, es bleibt euch nicht erspart ;-)
Ich hab's befürchtet ... *g*
Die Geisel der SuSE-Listen ist unerbittlich. -- Machs gut | http://www.iiv.de/schwinde/buerger/tremmel/ Manfred | http://www.knightsoft-net.de
Bernhard Walle wrote at 01.06.2002 um 13:37:08 +0200: Hello Bernhard,
On Sat, 01 Jun 2002 at 13:30 (+0200), Manfred Tremmel wrote:
Am Samstag, 1. Juni 2002 11:21 schrieb Bernhard Walle:
(2.4.19-pre9 mit dem neuen gcc 3.1.1) bringt massenweise Warnings zu Tage (hauptsächlich deprecated Warnings, also eigentlich unkritisch, aber doch vorhanden).
Das liegt aber dann wohl eher daran, dass man bisher mit dem gcc2.xx gearbeitet hat und jetzt mit der Anpassung auf den gcc3 beschäftigt ist. Natürlich: Mit sauberem ANSI-C wäre das nicht passiert ... ;-)
hmm, vieleicht. Nur im Kernel ist oft um Compilerbugs im gcc herumprogrammiert worden. Das fällt jetzt bei der um diese Bugs bereinigten gcc-Version halt auf. Ob man da mit sauberem ANSI-C an jedem Bug vorgegeschifft wäre, weiss ich aber auch nicht so genau.
PS: Ja ich bin auch auf der Liste, es bleibt euch nicht erspart ;-)
Ich hab's befürchtet ... *g*
es bleibt einem aber auch garnichts erspart :-) Michael -- ---------------------------------------------------------- Michael Schulz, Institut f. Geophysik, Universität Münster Corrensstr. 24, 48149 Münster Tel.: 0251-8333938, e-mail: michael@earth.uni-muenster.de
Helga Fischer wrote:
Wenn er sagt, no debugging symbols found, dann heißt das, das der verwendete Code keine Debugging-Informationen enthält (die kann man mitkompilieren). Warum aber gibt es dann trotzdem noch Informationen? Und wie aussagekräftig sind sie?
100% aussagekraefitg. Das was er an Informationen besorgen kann, sind die Einsprungsadressen der Funktionen. Im backtrace stehen die hexadezimal Adressen der Bibliotheksfunktionen, die der Crash-Manager liest. Dann schaut er in den Bibliotheken nach den export-Symbolen und listet die auf. Die Meldung am Anfang bezieht sich auf die Extra-Informationen, die der gcc dem gdb zur Verfuegung stellen koennte. Dann steht dort ein Verweis auf das Source-File und die Zeilennummer in der die fehlerhafte Zeile auftaucht. Programme gezielt wegschiessen kann man mit "kill -6 <pid>" und dann taucht der Crash-Manager auf. hier die Ausgabe bei mir: (no debugging symbols found)...(no debugging symbols found)... 0x41040079 in wait4 () from /lib/libc.so.6 #0 0x41040079 in wait4 () from /lib/libc.so.6 #1 0x410bab98 in __DTOR_END__ () from /lib/libc.so.6 #2 0x40ed5072 in waitpid () from /lib/libpthread.so.0 #3 0x406cb08e in KCrash::defaultCrashHandler () from /opt/kde3/lib/libkdecore.so.4 #4 0x40ed2a74 in pthread_sighandler () from /lib/libpthread.so.0 *** hier beginnt der interessante Teil *** #5 <signal handler called> #6 0x41069d6e in select () from /lib/libc.so.6 #7 0x40da6984 in __DTOR_END__ () from /usr/lib/libqt-mt.so.3 #8 0x40956a14 in QApplication::enter_loop () from /usr/lib/libqt-mt.so.3 #9 0x40903df6 in QApplication::exec () from /usr/lib/libqt-mt.so.3 #10 0x0806568a in QScrollView::mouseReleaseEvent () #11 0x40fb59ed in __libc_start_main () from /lib/libc.so.6 Mein KNotes hat also geduldig in der select()-funktion gewartet, bis es starb. und aus dem gdb-info file: #0 m4_traceon (obs=0x24eb0, argc=1, argv=0x2b8c8) at builtin.c:993 #1 0x6e38 in expand_macro (sym=0x2b600) at macro.c:242 #2 0x6840 in expand_token (obs=0x0, t=177664, td=0xf7fffb08) at macro.c:71 (More stack frames follow...) Es fehlen also auch noch die Argumentlisten inkl. der Werte. Peter
participants (6)
-
Bernhard Walle
-
David Haller
-
Helga Fischer
-
Manfred Tremmel
-
Michael Schulz
-
Peter Wiersig