Hat jemand Erfahrung mit dem Debuggen von Pascal-Programmen in LINUX? Mir gelingt es nicht, mit dem Debugger den Inhalt von Variablen anzuzeigen. Josef Müller
JMueller@Dresden.DE wrote:
Hat jemand Erfahrung mit dem Debuggen von Pascal-Programmen in LINUX? Mir gelingt es nicht, mit dem Debugger den Inhalt von Variablen anzuzeigen. Josef Müller
... keine direkte Loesung fuer dein Problem, aber vielleicht hilft es ja trotzdem ...
Ich habe beinahe noch nie einen Debugger zur Fehlersuche genutzt ... Es geht IMHO nichts ueber ein gutes printf / writeln an der richtigen Stelle ... Damit kannst du dir auch den Inhalt der Variablen anschauen ...
Wichtig ist eigentlich nur, dass du saemtliche Ausgaben mit einem Newline abschliesst. Sonst werden sie gepuffert und diese Puffer landen bei einem segmentation fault im Nirvana ...
Mit bedingter Compilierung und einem debug-include ist das alles noch ein wenig komfortabler, aendert aber nicht am Prinzip. (sollte auch unter Pascal moeglich sein, weiss ich nicht, schon lange keine Pascal mehr gemacht)
Bye.
Jens
Josef Müller:
Hat jemand Erfahrung mit dem Debuggen von Pascal-Programmen in LINUX? Mir gelingt es nicht, mit dem Debugger den Inhalt von Variablen anzuzeigen.
Was nimmst du denn für einen Pascal-Compiler ? GNU-Pascal oder FreePascal ?
Die GNU-Variante sollte ordentliche Debugsymbole erzeugen und funkt AFAIK auch prima mit gdb, also dann auch mit DDD.
Bei der "OpenSource"-Software die von anderen Systemen kommt, wie NASM zum Beispiel, siehts mit den Debugsymbolen etwas trostlos aus (z.B. keine Zeileninfo).
Bei FreePascal sollte das aber schon funktionieren ...
Probier mal:
gdb program-mit-debuginfo set args Kommandozeilenparameter break dateiname:Zeilennummer run .... display Variablenname step step ....
Interessant beim Segfault ist noch: backtrace oder bt oder where disassemble und info registers ;)
Am Fre, 31 Mär 2000 schrieb Jens Lorenz:
Ich habe beinahe noch nie einen Debugger zur Fehlersuche genutzt ... Es geht IMHO nichts ueber ein gutes printf / writeln an der richtigen Stelle ... Damit kannst du dir auch den Inhalt der Variablen anschauen ...
printf ist gut, gdb mit display ist besser. IMHO ist DDD bei der Variableninspektion etwas umständlich zu bedienen.
Wichtig ist eigentlich nur, dass du saemtliche Ausgaben mit einem Newline abschliesst. Sonst werden sie gepuffert und diese Puffer landen bei einem segmentation fault im Nirvana ...
Meiner Erfahrung nach hat das nichts mit einem "\n" am Ende zu tun. z.B. hatte ich vor kurzem eine komplette Ausgabe, wenn stdout in eine Datei ging,allerdings eine unvollständige bei der Ausgabe ins Terminal. Natürlich endete das Programm beides mal mit SegFault.
Kann mal jemand das mit dem Puffern genauer erläutern ??
Bye, Stephan
Stephan Goetter wrote:
Nabend,
Meiner Erfahrung nach hat das nichts mit einem "\n" am Ende zu tun. z.B. hatte ich vor kurzem eine komplette Ausgabe, wenn stdout in eine Datei ging,allerdings eine unvollständige bei der Ausgabe ins Terminal. Natürlich endete das Programm beides mal mit SegFault.
Kann mal jemand das mit dem Puffern genauer erläutern ??
Hm. Obiges Phaenomen ist mir ganz neu.
Was soll denn zum Puffern erlaeutert werden ? Ich versuche mal 'nen Anfang, gestehe aber gleich, dass ich die ganz genauen Linux-Interna nicht kenne ...
Also, saemtlichen schreibenden und lesenden Ausgaben in die Dateisysteme sind Ein- und Ausgabe-Puffer nach-/vorgeschaltet.
Soll aus einer Datei gelesen werden, wird erst im Puffer geschaut, ob der Teil der Datei schoneinmal gelesen wurde. Nur wenn die Daten nicht im Puffer sind, werden sie wirklich von der Platte gelesen ...
Entsprechend wird beim Schreiben alles zuerst in den Schreibpuffer geschrieben und erst wenn der Puffer voll ist, wirklich auf die Platten geschrieben ... (ausserdem etwa jede Minute einmal, sowie auf ausdruecklichen Wunsch)
Auf Terminals erfolgt AFAIK die Ein- und Ausgabe zeilenorientiert. Deswegen wird der Puffer nur immer bis zum naechsten Newline gefuellt und dann auf das Terminal geschrieben ...
Wenn du die Ausgaben wirklich in Sicherheit wissen willst, kannst du ja nach jedem write noch ein flush() machen, dann sind sie wirklich in Sicherheit. (aber meiner Erfahrung nach reicht ein \n)
... wie gesagt, die wirklich Linux-Interna kenne ich nicht ...
Bye.
Jens
Hallo,
Jens Lorenz htw9935@informatik.htw-dresden.de schrieb:
Also, saemtlichen schreibenden und lesenden Ausgaben in die Dateisysteme sind Ein- und Ausgabe-Puffer nach-/vorgeschaltet.
Soll aus einer Datei gelesen werden, wird erst im Puffer geschaut, ob der Teil der Datei schoneinmal gelesen wurde. Nur wenn die Daten nicht im Puffer sind, werden sie wirklich von der Platte gelesen ...
Entsprechend wird beim Schreiben alles zuerst in den Schreibpuffer geschrieben und erst wenn der Puffer voll ist, wirklich auf die Platten geschrieben ... (ausserdem etwa jede Minute einmal, sowie auf ausdruecklichen Wunsch)
Da muss man zwischen den Puffern im OS und den vom Programm verwalteten unterscheiden. Das was Du beschrieben hast, sind die OS-Puffer. Ob das was dorthin geschrieben ist, auch wirklich in der Datei landet, ist unabhaengig davon, ob das schreibende Programm gecrasht ist oder nicht - es kommt in jedem Fall an (Na gut, wenn das Betriebssystem oder die Hardware einen Crash hatten, dann nicht).
Dann gibt es noch die von der Laufzeitbibliothek verwalteten Puffer. Da wird im Normalfall ein Speicherbereich reserviert, in den beim Schreiben die Daten erstmal gesammelt werden, bevor sie an das Betriebssystem durchgereicht werden. Dies geschieht, damit nicht im schlimmsten Fall fuer jedes einzelne vom Programm geschriebene Byte ein Systemcall getaetigt werden muss - auf die Dauer waere das eine zeitaufwendige Sache. Wann der Puffer an das Betriebssystem uebergeben wird, entscheidet die Laufzeitbibliothek (unter Linux ist das in der Regel die libc), die Entscheidung kann aber vom Programm beeinflusst werden. (Das Lesen aus einer Datei laeuft analog ab.)
Der Crash eines Programms mit Segfault fuehrt dann dazu, dass alles, was in den libc-Puffern steht, nicht ans Betriebssystem geht (nichtmal an /dev/null ;-)) und im Hauptspeicher nur mit grossen Muehen gefunden werden kann (wenn ueberhaupt).
Mal sehen, ob das einige Klarheiten beseitigt...
Holger
lug-dd@mailman.schlittermann.de