Debugging - Wie mach ich das richtig?
Debugging - Wie mach ich das richtig?
Hi Leute,
Mein letztes Projekt ist ziemlich umfangreich, und bei Fehlern bin ich immer Stundenlang damit beschäftigt, den Fehler zu finden.
Ich habe bereits versucht bei Exceptions, diese Abzufangen und in einer Datei reinzuschreiben. Da bekomme ich aber bloß die Adressen... Was soll ich denn jetzt damit anfangen?
Da es eine Konsolenanwendung ist, lässt es sich nicht so toll unter Linux debuggen und ich habe noch keine Zeit gefunden, nach zu schauen, warum ich kein output sehen kann.
Mit den Einstellungen das ganze als "fremdprogramm" in der konsole zu starten, funktioniert das irgendwie nicht, vielleicht mache ich da auch was falsch.
Jedenfalls wäre es ganz toll, wenn hier die Profis mal ihre Tipps dazu verraten würden. Ich habe nämlich die schnauze voll immer Stundenlang die stelle zu suchen an dem ich ein Fehler eingebaut habe, obwohl man meinen sollte dass das bei 10k Zeilen noch ein kleineres Problem sein würde...
Gruß
Displaced
Mein letztes Projekt ist ziemlich umfangreich, und bei Fehlern bin ich immer Stundenlang damit beschäftigt, den Fehler zu finden.
Ich habe bereits versucht bei Exceptions, diese Abzufangen und in einer Datei reinzuschreiben. Da bekomme ich aber bloß die Adressen... Was soll ich denn jetzt damit anfangen?
Da es eine Konsolenanwendung ist, lässt es sich nicht so toll unter Linux debuggen und ich habe noch keine Zeit gefunden, nach zu schauen, warum ich kein output sehen kann.
Mit den Einstellungen das ganze als "fremdprogramm" in der konsole zu starten, funktioniert das irgendwie nicht, vielleicht mache ich da auch was falsch.
Jedenfalls wäre es ganz toll, wenn hier die Profis mal ihre Tipps dazu verraten würden. Ich habe nämlich die schnauze voll immer Stundenlang die stelle zu suchen an dem ich ein Fehler eingebaut habe, obwohl man meinen sollte dass das bei 10k Zeilen noch ein kleineres Problem sein würde...
Gruß
Displaced
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: Debugging - Wie mach ich das richtig?
Wenn ich ein Fehler habe, wo ich nicht die werte sehe, welche ich brauche. schreib ich immer die Variable in die TForm.Caption .Displaced hat geschrieben:Hi Leute,
Mein letztes Projekt ist ziemlich umfangreich, und bei Fehlern bin ich immer Stundenlang damit beschäftigt, den Fehler zu finden.
Ich habe bereits versucht bei Exceptions, diese Abzufangen und in einer Datei reinzuschreiben. Da bekomme ich aber bloß die Adressen... Was soll ich denn jetzt damit anfangen?
Da es eine Konsolenanwendung ist, lässt es sich nicht so toll unter Linux debuggen und ich habe noch keine Zeit gefunden, nach zu schauen, warum ich kein output sehen kann.
Mit den Einstellungen das ganze als "fremdprogramm" in der konsole zu starten, funktioniert das irgendwie nicht, vielleicht mache ich da auch was falsch.
Jedenfalls wäre es ganz toll, wenn hier die Profis mal ihre Tipps dazu verraten würden. Ich habe nämlich die schnauze voll immer Stundenlang die stelle zu suchen an dem ich ein Fehler eingebaut habe, obwohl man meinen sollte dass das bei 10k Zeilen noch ein kleineres Problem sein würde...
Gruß
Displaced
ist zwar ein wenig aufwendig, aber So kommt ich auch zum ergebnis.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


Re: Debugging - Wie mach ich das richtig?
Genau so mach ich das auch, nur dass ich vorher erst entscheiden muss, bei welchem Paket der Fehler auftritt...
Also werden überall ausgaben ausgespuckt und dann gewartet bis das Programm abstürzt, und dann den Suchbereich weiter eingrenzen, aber das kann unter Umständen lange dauern, wenn man an der falschen Stelle sucht =(
EDIT:
Mir ist grad aufgefallen, dass wenn ich die IDE an habe, der mir die Zeilen im code anzeigt wo das ist.
Wie mach ich das, dass der das auch ohne IDE macht? =( Von mir aus kann die executable auch doppeld so groß sein, hauptsache die informationen sind da...
Also werden überall ausgaben ausgespuckt und dann gewartet bis das Programm abstürzt, und dann den Suchbereich weiter eingrenzen, aber das kann unter Umständen lange dauern, wenn man an der falschen Stelle sucht =(
EDIT:
Mir ist grad aufgefallen, dass wenn ich die IDE an habe, der mir die Zeilen im code anzeigt wo das ist.
Wie mach ich das, dass der das auch ohne IDE macht? =( Von mir aus kann die executable auch doppeld so groß sein, hauptsache die informationen sind da...
-
- Beiträge: 586
- Registriert: Mi 25. Mär 2009, 21:12
- OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
- CPU-Target: mostly 32 bit
Re: Debugging - Wie mach ich das richtig?
Um Linux-Konsole in Lazarus zu debuggen:
In der SVN version (nicht sicher ob 0.9.30.1 fixes) gibt es ein Debug => Konsole-Fenster (im "View" Menu. Damit sollte es moeglich sein die Anwendung in Lazarus zu debuggen.
Andernfalls im Options dialog, Debugger, kann man eine tty fuer Konsole festlegen:
- starte eine beliebige Shell (außerhalb von Lazarus)
- execute "tty" (Kommando) => Ergebnis in Optionen eintragen
Damit gehen alle Programm ein/ausgaben in das Terminal
Um Backtraces innerhalb des Programms mit Source Lines ausgeben: Mit -gl Kompilieren.
In der SVN version (nicht sicher ob 0.9.30.1 fixes) gibt es ein Debug => Konsole-Fenster (im "View" Menu. Damit sollte es moeglich sein die Anwendung in Lazarus zu debuggen.
Andernfalls im Options dialog, Debugger, kann man eine tty fuer Konsole festlegen:
- starte eine beliebige Shell (außerhalb von Lazarus)
- execute "tty" (Kommando) => Ergebnis in Optionen eintragen
Damit gehen alle Programm ein/ausgaben in das Terminal
Um Backtraces innerhalb des Programms mit Source Lines ausgeben: Mit -gl Kompilieren.
Re: Debugging - Wie mach ich das richtig?
Okay ich werds mir mal anschauen.
Und zum anderen: Ich kompiliere die Programme immer mit -gl aber nur auf dem System wo Lazarus drauf installiert ist, bekomme ich die Zeilen auch. Auf dem Server nicht mehr.
Und zum anderen: Ich kompiliere die Programme immer mit -gl aber nur auf dem System wo Lazarus drauf installiert ist, bekomme ich die Zeilen auch. Auf dem Server nicht mehr.
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: Debugging - Wie mach ich das richtig?
Moin Moin,
Bin zugegeben auch an einem kleines Problem mit einer Wertumwandlung.
wenn man diese Zeilen mit papier und Bleistift nachzieht, erhält man die werte aber mein rechner sagt mir Vermude irgendwie, das die Zuweisung querschiest, aber wenn ich bei der Schleife kein Fehler habe, sollten die werte zurückgerechnet werden.
sieht da von euch ggf. die Fehlerhafte Adresse?
Hier hab i mal den Konsolenautput
Bin zugegeben auch an einem kleines Problem mit einer Wertumwandlung.
Code: Alles auswählen
Procedure TForm3.BMI;
var
temp: Array[0..3] of Real;
Count, E_leng: Byte;
begin
Edit[0, 0]:= Edit4.Text;
Edit[1, 0]:= Edit5.Text;
Edit[0, 1]:= '';
Edit[1, 1]:= '';
Caption:= DecimalSeparator;
for Count:= 0 to 1 do
begin
_temp:= Edit[Count, 0];
for E_leng := 1 to Length(_Temp) do
begin
Caption := Caption + IntToStr(Count) + '^';
if (_Temp[E_leng-1] = '.') or (_Temp[E_leng-1] = ',') then
Edit[Count, 1]:= Edit[Count, 1] + {'.'//}DecimalSeparator
else
Edit[Count, 1]:= Edit[Count, 1] + _temp[E_leng-1];
end;
end;
Caption:= Caption + Edit[0, 0] + '-' + Edit[1, 0] + '|' + Edit[0, 1] + '-' + Edit[1, 1];
end;
Code: Alles auswählen
Edit[x, 1] = ''
sieht da von euch ggf. die Fehlerhafte Adresse?
Hier hab i mal den Konsolenautput
Code: Alles auswählen
TApplication.HandleException "1.6" is an invalid float
Stack trace:
$000000000054B8B4
$000000000054B7F3
$000000000051941C
$0000000000519E59
$00000000006DC8B9
$00000000006DC82A
$0000000000665649
$00000000004EB765
$000000000065B648
$000000000076F68F
$000000000073AAA9
$0000000000746A69
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


Re: Debugging - Wie mach ich das richtig?
Bei deinem Code kommt das bei mir raus:
.0^0^0^0^1^1^1^1^56.4-1.75|
.0^0^0^0^1^1^1^1^56.4-1.75|
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: Debugging - Wie mach ich das richtig?
und was steht bei die nach dem |??? wie ich sehe das selbe wie bei mir. Sollte eigendlich schon an der Letzten Caption zusehene sein, was da zu stehen hat.Displaced hat geschrieben:Bei deinem Code kommt das bei mir raus:
.0^0^0^0^1^1^1^1^56.4-1.75|
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


Re: Debugging - Wie mach ich das richtig?
Stimmt, naja irgendwie viel es mir schwer diesen code zu lesen, keine ahnung warum.
Ich hab jedenfalls den Fehler.
das "-1" ist falsch, weil ein String nicht bei 0 beginnt sondern bei 1...
Ich hab jedenfalls den Fehler.
das "-1" ist falsch, weil ein String nicht bei 0 beginnt sondern bei 1...
-
- Beiträge: 619
- Registriert: Mi 9. Mär 2011, 16:34
- OS, Lazarus, FPC: Ubuntu10.04 LTS (L 0.9.31.0 FPC 2.4.4)
- CPU-Target: 64Bit
- Wohnort: seit 01.06.2011 in Wahlstedt
Re: Debugging - Wie mach ich das richtig?
STimmt der verfluchter Count ^^ immer der selbeDisplaced hat geschrieben:Stimmt, naja irgendwie viel es mir schwer diesen code zu lesen, keine ahnung warum.
Ich hab jedenfalls den Fehler.
das "-1" ist falsch, weil ein String nicht bei 0 beginnt sondern bei 1...

Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache
und der Kreis Segeberg meine LIEBE 


-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: Debugging - Wie mach ich das richtig?
Hallo,
Ich mache mein Exception-Handling komplett anders. Ich verwende nur in Ausnahmefällen Try Except. Ich lasse es einfach mit Absicht knallen denn dann wird das aufgerufen:
Application.OnException
Damit wiederum rufe ich eine eigene Funktion auf die mir die Liste der letzten Funktionen ausgibt und in ein Log schreibt.
Wie das geht? Ganz aufwändig.
Ich habe eine TStringList in der alle Funktionen und sonstige Zwischeninfos gespeichert werden.
Bei jedem Funktionsaufruf gibt es ein AddErrString('MeinFunktionsname');
Bei jedem verlassen der Funktion gibt es den RemoveErrString(); der den letzten Eintrag wieder aus der Liste entfernt.
Um zwischendurch einen Infos zu schreiben kann ich entweder einen erneuten AddErrString('Infoxxx'); oder einen ChangeErrString('infoyyy'); machen.
Jeder Add braucht natürlich einen Remove
Wenn man mit Abort; das Programm abbricht, muss ein ClearErrList(); ausgeführt werden.
Jetzt knallt es irgendwo und es wird automatisch Application.OnException ausgeführt, darin wird nun der ganze Text der in der StringListe drin ist ausgegeben.
Ich habe über 30000 Codezeilen in meinem Programm, ohne diese Ausgabe könnte ich vergessen herauszufinden was der User gerade für eine Aktion ausgeführt hat.
Das Aufwändige: Jede Funktion braucht dieses "Extra" in der Programmierung. Allerdings habe ich Funktionen wie "DrawColumnCell" für ein Grid nicht drin, denn dann wird die Anwendung merklich langsamer im Grid malen.
Ich lasse es auch deshalb mit Absicht knallen, damit ich so auch jeden Fehler erkennen kann und ich kann das Programm somit besser gestalten, damit vor dem Knall alle möglichen Fehler berücksichtigt werden.
(Beispiel: nicht StringToInt() verwenden, sondern besser StringToIntDef() oder vorher den String auf Gültigkeit prüfen)
Grüße Markus
Ich mache mein Exception-Handling komplett anders. Ich verwende nur in Ausnahmefällen Try Except. Ich lasse es einfach mit Absicht knallen denn dann wird das aufgerufen:
Application.OnException
Damit wiederum rufe ich eine eigene Funktion auf die mir die Liste der letzten Funktionen ausgibt und in ein Log schreibt.
Wie das geht? Ganz aufwändig.
Ich habe eine TStringList in der alle Funktionen und sonstige Zwischeninfos gespeichert werden.
Bei jedem Funktionsaufruf gibt es ein AddErrString('MeinFunktionsname');
Bei jedem verlassen der Funktion gibt es den RemoveErrString(); der den letzten Eintrag wieder aus der Liste entfernt.
Um zwischendurch einen Infos zu schreiben kann ich entweder einen erneuten AddErrString('Infoxxx'); oder einen ChangeErrString('infoyyy'); machen.
Jeder Add braucht natürlich einen Remove
Wenn man mit Abort; das Programm abbricht, muss ein ClearErrList(); ausgeführt werden.
Jetzt knallt es irgendwo und es wird automatisch Application.OnException ausgeführt, darin wird nun der ganze Text der in der StringListe drin ist ausgegeben.
Ich habe über 30000 Codezeilen in meinem Programm, ohne diese Ausgabe könnte ich vergessen herauszufinden was der User gerade für eine Aktion ausgeführt hat.
Das Aufwändige: Jede Funktion braucht dieses "Extra" in der Programmierung. Allerdings habe ich Funktionen wie "DrawColumnCell" für ein Grid nicht drin, denn dann wird die Anwendung merklich langsamer im Grid malen.
Ich lasse es auch deshalb mit Absicht knallen, damit ich so auch jeden Fehler erkennen kann und ich kann das Programm somit besser gestalten, damit vor dem Knall alle möglichen Fehler berücksichtigt werden.
(Beispiel: nicht StringToInt() verwenden, sondern besser StringToIntDef() oder vorher den String auf Gültigkeit prüfen)
Grüße Markus
EleLa - Elektronik Lagerverwaltung - www.elela.de
Re: Debugging - Wie mach ich das richtig?
Genau so wollte ich das auch machen, wenn es keine andere möglichkeit gibt.
Ich lass es im Moment auch knallen und geb dann die Backtrace log out. Auf meinem PC bekomme ich das ganze mit zusätzlichen Zeileninfos.
Auf dem Server nur die Adressen, leider.
Also werde ich das genau so machen wie du. Genau die selbe Lösung die ich auch machen wollte, was für ein Zufall =P
Ich lass es im Moment auch knallen und geb dann die Backtrace log out. Auf meinem PC bekomme ich das ganze mit zusätzlichen Zeileninfos.
Auf dem Server nur die Adressen, leider.
Also werde ich das genau so machen wie du. Genau die selbe Lösung die ich auch machen wollte, was für ein Zufall =P
-
- Beiträge: 586
- Registriert: Mi 25. Mär 2009, 21:12
- OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
- CPU-Target: mostly 32 bit
Re: Debugging - Wie mach ich das richtig?
Merkwürdig.Displaced hat geschrieben: Und zum anderen: Ich kompiliere die Programme immer mit -gl aber nur auf dem System wo Lazarus drauf installiert ist, bekomme ich die Zeilen auch. Auf dem Server nicht mehr.
Ein paar Ideen, allerdings ungetestet. Und ich bin nicht sicher ob die Dinge so zusammenhängen....
- Du verwendest nicht etwa "externe debug info"? Dann wäre die Zeileninfo ja nur mit der extra Datei verfuegbar...
- Ich compiliere immer mit "-g -gl" oder "-gw -gl". AFAIK sollte -gl alleine reichen (für Zeilen info), aber wäre mal nen versuch Wert?
Wenn das mit den Zeilen im backtrace so nicht will. Dann compiliere mit -g -gl, und starte GDB auf dem Server.
gdb -i mi /path/to/yourproject
Füge ein paar breakpoints ein
-break-insert FPC_RAISEEXCEPTION
-break-insert FPC_BREAK_ERROR
-break-insert FPC_RUNERROR
und start your programm ("r"). Wenn es einen breakpoint erreicht "bt"
Re: Debugging - Wie mach ich das richtig?
Jetzt klappts, mit g und gl klappt das wunderbar. Vielen dank =)
-
- Beiträge: 1581
- Registriert: Fr 10. Okt 2008, 23:54
- OS, Lazarus, FPC: Winuxarm (L 4 FPC 3.2.2)
- CPU-Target: 32/64Bit
Re: Debugging - Wie mach ich das richtig?
Wie kann ich die backtrace Info (-gl) zur Laufzeit bei einer Exception auslesen?
EleLa - Elektronik Lagerverwaltung - www.elela.de