Zeilennummer bei ABEND in Programm
Zeilennummer bei ABEND in Programm
Hi Folks.
Ist es möglich dass ein C-Programm bei einem abnormalen Programmende die Zeilennummer der "bösen" Source-Code-Zeile ausgibt. Ich habe in der gcc-man-page herumgestöbert, finde aber nichts dergleichen. Aus den dump-optionen des gcc werde ich auch nicht schlau (Ich will ja nicht den gcc debuggen ??).
Gruss und Dank
Andy
Ist es möglich dass ein C-Programm bei einem abnormalen Programmende die Zeilennummer der "bösen" Source-Code-Zeile ausgibt. Ich habe in der gcc-man-page herumgestöbert, finde aber nichts dergleichen. Aus den dump-optionen des gcc werde ich auch nicht schlau (Ich will ja nicht den gcc debuggen ??).
Gruss und Dank
Andy
Re: Zeilennummer bei ABEND in Programm
übersetz dein c-programm mit der -g option und starte es dann mit gdb
(oder auch ddd, wenn du ne oberfläche brauchst)
(oder auch ddd, wenn du ne oberfläche brauchst)
Re: Zeilennummer bei ABEND in Programm
Besser (und guter Stil) wäre von vornherein den Code mit entsprechenden Debug-Macros zu umgeben und die vordefinierten Macros wie __LINE__ oder __FILE__ dazu zu benutzen um entsprechende Zusatzinformation auszugeben.
Der Debugger sollte das letzte Mittel sein um Fehler aufzuspüren.
Der Debugger sollte das letzte Mittel sein um Fehler aufzuspüren.
Re: Zeilennummer bei ABEND in Programm
Hi CodeDump.
Danke aber das ist mir schon klar. Denn ddd kenn ich. Es gibt bei uns in der Firma bei PGMABENDS unserer COBOL-Programme eine Fehlermeldung eben mit Zeilennummer. Das ist sehr angenehmr weil man dann sofort den Code inpizieren kann.
@arni
Wir habe schon ein Debug-Feature in Form von Verbose-Levels die eine Eingrenzung des Fehlers erlauben.
Aber vielleicht ist der Fehler ja nicht wiederholbar. Dann nützt mir Debuggen nichts und dank der Zeilennummer weis ich aber schon wo es ein Problem geben kann. Die Ursache liegt möglicherweise viel weiter vorne im Code sodass man um eine Analyse der Abhängigkeiten wahrscheinlich nicht umhinkommt.
Danke aber das ist mir schon klar. Denn ddd kenn ich. Es gibt bei uns in der Firma bei PGMABENDS unserer COBOL-Programme eine Fehlermeldung eben mit Zeilennummer. Das ist sehr angenehmr weil man dann sofort den Code inpizieren kann.
@arni
Wir habe schon ein Debug-Feature in Form von Verbose-Levels die eine Eingrenzung des Fehlers erlauben.
Aber vielleicht ist der Fehler ja nicht wiederholbar. Dann nützt mir Debuggen nichts und dank der Zeilennummer weis ich aber schon wo es ein Problem geben kann. Die Ursache liegt möglicherweise viel weiter vorne im Code sodass man um eine Analyse der Abhängigkeiten wahrscheinlich nicht umhinkommt.
Re: Zeilennummer bei ABEND in Programm
Hi!
Was spricht dagegen, Coredumps zu aktivieren und dann schnell mit gdb zu öffnen? Da kann man gleich noch ein Backtrace und Werte von Variablen ausgeben lassen. Das ist wohl hilfreicher als nur die Zeilennummer. Und man muss das Programm nicht von Anfang an im gdb laufen lassen, d.h. es funktioniert auch dann, wenn es nicht ohne weiteres möglich ist, den Fehler zu reproduzieren.
Cheers,
GNU/Wolfgang
Was spricht dagegen, Coredumps zu aktivieren und dann schnell mit gdb zu öffnen? Da kann man gleich noch ein Backtrace und Werte von Variablen ausgeben lassen. Das ist wohl hilfreicher als nur die Zeilennummer. Und man muss das Programm nicht von Anfang an im gdb laufen lassen, d.h. es funktioniert auch dann, wenn es nicht ohne weiteres möglich ist, den Fehler zu reproduzieren.
Cheers,
GNU/Wolfgang
Re: Zeilennummer bei ABEND in Programm
Hi Wolfgang.
Das hat was für sich.
Man kann also mit dem gdb den core "lesen".
Damit hat man zwar noch nicht den Bezug zur Sourcelinbe aber einen Anhaltspunkt über
die Absturzursache
Gruss
SULU
Das hat was für sich.
Man kann also mit dem gdb den core "lesen".
Damit hat man zwar noch nicht den Bezug zur Sourcelinbe aber einen Anhaltspunkt über
die Absturzursache
Gruss
SULU
Re: Zeilennummer bei ABEND in Programm
Hi!
> Damit hat man zwar noch nicht den Bezug zur Sourcelinbe aber einen Anhaltspunkt über die Absturzursache
Wie kommst du darauf, dass man nicht den Bezug zur Quellcode-Zeile hätte?
Cheers,
GNU/Wolfgang
> Damit hat man zwar noch nicht den Bezug zur Sourcelinbe aber einen Anhaltspunkt über die Absturzursache
Wie kommst du darauf, dass man nicht den Bezug zur Quellcode-Zeile hätte?
Cheers,
GNU/Wolfgang
Re: Zeilennummer bei ABEND in Programm
@Wolfgang
"Wie kommst du darauf, dass man nicht den Bezug zur Quellcode-Zeile hätte?"
Ähem !
War nur so gedacht.
Aber muss nicht die -g Option aktivieren damit der gdb auch die Infos hat die er braucht?
Die Debug-Info bläst halt die Binaries auf. Hmmm.. Damit könnte man leben.
Gruss
Sulu
"Wie kommst du darauf, dass man nicht den Bezug zur Quellcode-Zeile hätte?"
Ähem !
War nur so gedacht.
Aber muss nicht die -g Option aktivieren damit der gdb auch die Infos hat die er braucht?
Die Debug-Info bläst halt die Binaries auf. Hmmm.. Damit könnte man leben.
Gruss
Sulu
Re: Zeilennummer bei ABEND in Programm
Hi!
> Die Debug-Info bläst halt die Binaries auf.
Ja, ein wenig; aber ich glaube nicht, dass deswegen die Platte zu schnell voll wird. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Hmmm, im Topic des #hurd-Channels auf OPN steht gerade: "Debian sucks, it does not include debugging symbols to make the life of all hackers easier." Was sol man da noch hinzufügen? Mir wäre es auch lieber, wenn alle Programme Debugging-Symbole enthalten würden. Nicht ohne Grund ist das die Voreinstellung von GNU Automake.
Cheers,
GNU/Wolfgang
> Die Debug-Info bläst halt die Binaries auf.
Ja, ein wenig; aber ich glaube nicht, dass deswegen die Platte zu schnell voll wird. <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Hmmm, im Topic des #hurd-Channels auf OPN steht gerade: "Debian sucks, it does not include debugging symbols to make the life of all hackers easier." Was sol man da noch hinzufügen? Mir wäre es auch lieber, wenn alle Programme Debugging-Symbole enthalten würden. Nicht ohne Grund ist das die Voreinstellung von GNU Automake.
Cheers,
GNU/Wolfgang
Re: Zeilennummer bei ABEND in Programm
> Was spricht dagegen, Coredumps zu aktivieren und dann schnell mit gdb zu öffnen?
Das mag vielleicht eine ziemlich dumme Frage sein, aber wie aktiviere ich denn Coredumps? Kann ich's irgendwie so einstellen, daß ich zu jedem abgestürzten Programm -- also nicht nur zu meinen eigenen, oder Programmen die ich im Debugger starte -- anschließend einen Coredump erhalte?
Ich denke dabei z.B. an einige Situationen, wo mir X11 unter mysteriösen Umständen abgeschmiert ist. Nun ja, die Ursache war ein Segfault, soviel weiß ich, aber was, wie, und wo? Da wäre ein Coredump ganz praktisch, und zwar ohne daß ich X ständig im Debugger laufen lassen muß, und ohne daß ich's mit Debug-Info rekompilieren muß (daß ein Coredump ohne Debug-Info nur bedingt aussagekräftig ist, ist mir klar)...
Wahrscheinlich habe ich irgendwo etwas offensichtliches übersehen, oder? Wäre nett, wenn mich da mal jemand aufklären könnte...
Danke,
Dominic
Das mag vielleicht eine ziemlich dumme Frage sein, aber wie aktiviere ich denn Coredumps? Kann ich's irgendwie so einstellen, daß ich zu jedem abgestürzten Programm -- also nicht nur zu meinen eigenen, oder Programmen die ich im Debugger starte -- anschließend einen Coredump erhalte?
Ich denke dabei z.B. an einige Situationen, wo mir X11 unter mysteriösen Umständen abgeschmiert ist. Nun ja, die Ursache war ein Segfault, soviel weiß ich, aber was, wie, und wo? Da wäre ein Coredump ganz praktisch, und zwar ohne daß ich X ständig im Debugger laufen lassen muß, und ohne daß ich's mit Debug-Info rekompilieren muß (daß ein Coredump ohne Debug-Info nur bedingt aussagekräftig ist, ist mir klar)...
Wahrscheinlich habe ich irgendwo etwas offensichtliches übersehen, oder? Wäre nett, wenn mich da mal jemand aufklären könnte...
Danke,
Dominic
Re: Zeilennummer bei ABEND in Programm
Hi!
> Das mag vielleicht eine ziemlich dumme Frage sein, aber wie aktiviere ich denn Coredumps?
man ulimit
Was aber an einem Coredump ohne Debugging-Symbole sinnvoll sein soll, weiß ich nicht, erscheint mir völlig nutzlos.
Cheers,
GNU/Wolfgang
> Das mag vielleicht eine ziemlich dumme Frage sein, aber wie aktiviere ich denn Coredumps?
man ulimit
Was aber an einem Coredump ohne Debugging-Symbole sinnvoll sein soll, weiß ich nicht, erscheint mir völlig nutzlos.
Cheers,
GNU/Wolfgang
Re: Zeilennummer bei ABEND in Programm
Ho Wolfgang.
Wenn ich dich richtig verstehe dann soll man die -g Option beim gcc standardmässig verwenden und man muss noch die Shell dazu bringen,
dass die bei einem Abend einen core schreibt (ulimit ??). Den core kann man anschliessend mit dem gdb analysieren.
Wenn das so geht dann werde ich das mal ausprobieren.
Ein kleines Null-Pointer-Assignment ist ja mit C kein grosses Problem<img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
Wenn ich dich richtig verstehe dann soll man die -g Option beim gcc standardmässig verwenden und man muss noch die Shell dazu bringen,
dass die bei einem Abend einen core schreibt (ulimit ??). Den core kann man anschliessend mit dem gdb analysieren.
Wenn das so geht dann werde ich das mal ausprobieren.
Ein kleines Null-Pointer-Assignment ist ja mit C kein grosses Problem<img src="http://www.pl-forum.de/UltraBoard/Images/Happy.gif" border="0" align="middle">
Re: Zeilennummer bei ABEND in Programm
Hm, erstmal danke.
Das mit den Coredumps funktioniert jetzt zumindest. Allerdings hätte ich erwartet, daß ich mit Hilfe der Core file dann auch einen Backtrace erhalten kann, was aber anscheinend nicht geht... Habe ich da etwas übersehen, oder ist das tatsächlich nicht möglich? Ich muß zugeben, der Nutzen eines Coredumps, ohne daß man sich anschließend den Backtrace ansehen kann, geht gegen null...
Dominic
Das mit den Coredumps funktioniert jetzt zumindest. Allerdings hätte ich erwartet, daß ich mit Hilfe der Core file dann auch einen Backtrace erhalten kann, was aber anscheinend nicht geht... Habe ich da etwas übersehen, oder ist das tatsächlich nicht möglich? Ich muß zugeben, der Nutzen eines Coredumps, ohne daß man sich anschließend den Backtrace ansehen kann, geht gegen null...
Dominic
Re: Zeilennummer bei ABEND in Programm
Hi!
Sulu schrieb:
> Wenn ich dich richtig verstehe dann soll man die -g Option beim gcc standardmässig verwenden und man muss noch die Shell dazu bringen, dass die bei einem Abend einen core schreibt (ulimit ??).
Ja. Da offenbar der Hinweis auf die Manpage nicht ausgereicht hat: "ulimit -c eine_zahl", wobei eine_zahl die maximale Größe eines Coredumps ist, der angelegt werden soll.
> Den core kann man anschliessend mit dem gdb analysieren.
Ja, und zwar via "gdb name_des_programms name_des_coredumps", wobei Coredumps unter GNU/Linux typischerweise "core" heißen, unter Unix-Systemen oft "programmname.core"
BugCreator schrieb:
> Allerdings hätte ich erwartet, daß ich mit Hilfe der Core file dann auch einen Backtrace erhalten kann, was aber anscheinend nicht geht...
Du Witzbold. Wie soll denn ein sinnvoler Backtrace angezeigt werden, wenn das Binary keine Informationen über die Namen von Funktionen und ihren Argumenten enthält? Der Debugger kann ja nicht zaubern.
Gerade deshalb finde ich es ja nervig, wenn Distributionen Programme ohne Debugging-Symbole enthalten.
Cheers,
GNU/Wolfgang
Sulu schrieb:
> Wenn ich dich richtig verstehe dann soll man die -g Option beim gcc standardmässig verwenden und man muss noch die Shell dazu bringen, dass die bei einem Abend einen core schreibt (ulimit ??).
Ja. Da offenbar der Hinweis auf die Manpage nicht ausgereicht hat: "ulimit -c eine_zahl", wobei eine_zahl die maximale Größe eines Coredumps ist, der angelegt werden soll.
> Den core kann man anschliessend mit dem gdb analysieren.
Ja, und zwar via "gdb name_des_programms name_des_coredumps", wobei Coredumps unter GNU/Linux typischerweise "core" heißen, unter Unix-Systemen oft "programmname.core"
BugCreator schrieb:
> Allerdings hätte ich erwartet, daß ich mit Hilfe der Core file dann auch einen Backtrace erhalten kann, was aber anscheinend nicht geht...
Du Witzbold. Wie soll denn ein sinnvoler Backtrace angezeigt werden, wenn das Binary keine Informationen über die Namen von Funktionen und ihren Argumenten enthält? Der Debugger kann ja nicht zaubern.
Gerade deshalb finde ich es ja nervig, wenn Distributionen Programme ohne Debugging-Symbole enthalten.
Cheers,
GNU/Wolfgang
Re: Zeilennummer bei ABEND in Programm
Hi Wolfgang!
Augenblick mal, selber Witzbold <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Es kann ja sein, daß ich hier einem riesigen Irrtum aufgesessen bin, aber soweit ich weiß braucht man nicht zwangsläufig volle Debug-Infos, um einen Backtrace zu erhalten, der zumindest die Funktionsnamen enthält. Sicher, die Infos über Parameter etc. hat man dann nicht, man weiß aber zumindest, wer wen in welcher Reihenfolge aufgerufen hat.
Naja, vielleicht sollte ich dazu sagen, daß ich in der Regel nicht in C, sondern in C++ programmiere (aber mit dem Thema will ich dich jetzt ja nicht quälen *fg*). Aber soweit ich weiß gilt auch für C-Programme, daß die Funktionsnamen auch dann im Binary enthalten sind, wenn man ohne -g kompiliert. Allerdings darf man das Binary dann nicht strippen (und genau das tun wahrscheinlich die Distributoren), denn danach sind die Namen wirklich weg.
Und davon mal abgesehen habe ich auch dann im gdb keinen Backtrace, wenn ich die Core file eines Programms öffne, das mit kompletten Debug-Infos kompiliert wurde. Und genau darauf zielte meine Frage ab, denn es wäre wirklich schön wenn...
Gute Nacht,
Dominic
Augenblick mal, selber Witzbold <img src="http://www.pl-forum.de/UltraBoard/Images/Wilk.gif" border="0" align="middle">
Es kann ja sein, daß ich hier einem riesigen Irrtum aufgesessen bin, aber soweit ich weiß braucht man nicht zwangsläufig volle Debug-Infos, um einen Backtrace zu erhalten, der zumindest die Funktionsnamen enthält. Sicher, die Infos über Parameter etc. hat man dann nicht, man weiß aber zumindest, wer wen in welcher Reihenfolge aufgerufen hat.
Naja, vielleicht sollte ich dazu sagen, daß ich in der Regel nicht in C, sondern in C++ programmiere (aber mit dem Thema will ich dich jetzt ja nicht quälen *fg*). Aber soweit ich weiß gilt auch für C-Programme, daß die Funktionsnamen auch dann im Binary enthalten sind, wenn man ohne -g kompiliert. Allerdings darf man das Binary dann nicht strippen (und genau das tun wahrscheinlich die Distributoren), denn danach sind die Namen wirklich weg.
Und davon mal abgesehen habe ich auch dann im gdb keinen Backtrace, wenn ich die Core file eines Programms öffne, das mit kompletten Debug-Infos kompiliert wurde. Und genau darauf zielte meine Frage ab, denn es wäre wirklich schön wenn...
Gute Nacht,
Dominic