Zeilennummer bei ABEND in Programm

Message
Author
Sulu

Zeilennummer bei ABEND in Programm

#1 Post by Sulu »

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

CoreDump

Re: Zeilennummer bei ABEND in Programm

#2 Post by CoreDump »

übersetz dein c-programm mit der -g option und starte es dann mit gdb
(oder auch ddd, wenn du ne oberfläche brauchst)

User avatar
arni
Posts: 73
Joined: 10. Feb 2002 19:32
Location: Berlin
Contact:

Re: Zeilennummer bei ABEND in Programm

#3 Post by arni »

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.

Sulu

Re: Zeilennummer bei ABEND in Programm

#4 Post by Sulu »

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.

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Zeilennummer bei ABEND in Programm

#5 Post by bakunin »

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

sulu
Posts: 64
Joined: 29. Oct 2001 10:13
Location: Dornbirn

Re: Zeilennummer bei ABEND in Programm

#6 Post by sulu »

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

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Zeilennummer bei ABEND in Programm

#7 Post by bakunin »

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

Sulu

Re: Zeilennummer bei ABEND in Programm

#8 Post by Sulu »

@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

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Zeilennummer bei ABEND in Programm

#9 Post by bakunin »

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

das
Posts: 78
Joined: 22. Jan 2001 1:37
Location: 42369 Wuppertal

Re: Zeilennummer bei ABEND in Programm

#10 Post by das »

> 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

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Zeilennummer bei ABEND in Programm

#11 Post by bakunin »

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

sulu
Posts: 64
Joined: 29. Oct 2001 10:13
Location: Dornbirn

Re: Zeilennummer bei ABEND in Programm

#12 Post by sulu »

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">

das
Posts: 78
Joined: 22. Jan 2001 1:37
Location: 42369 Wuppertal

Re: Zeilennummer bei ABEND in Programm

#13 Post by das »

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

bakunin
Posts: 597
Joined: 16. Aug 1999 6:44
Location: Lorsch (Südhessen)
Contact:

Re: Zeilennummer bei ABEND in Programm

#14 Post by bakunin »

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

das
Posts: 78
Joined: 22. Jan 2001 1:37
Location: 42369 Wuppertal

Re: Zeilennummer bei ABEND in Programm

#15 Post by das »

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

Post Reply