Debugging - Wie mach ich das richtig?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Debugging - Wie mach ich das richtig?

Beitrag von Displaced »

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

Maik81ftl
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?

Beitrag von Maik81ftl »

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
Wenn ich ein Fehler habe, wo ich nicht die werte sehe, welche ich brauche. schreib ich immer die Variable in die TForm.Caption .

ist zwar ein wenig aufwendig, aber So kommt ich auch zum ergebnis.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: Debugging - Wie mach ich das richtig?

Beitrag von Displaced »

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

martin_frb
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?

Beitrag von martin_frb »

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.

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: Debugging - Wie mach ich das richtig?

Beitrag von Displaced »

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.

Maik81ftl
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?

Beitrag von Maik81ftl »

Moin Moin,

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;
wenn man diese Zeilen mit papier und Bleistift nachzieht, erhält man die werte aber mein rechner sagt mir

Code: Alles auswählen

Edit[x, 1] = ''
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

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 :D und der Kreis Segeberg meine LIEBE :D

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: Debugging - Wie mach ich das richtig?

Beitrag von Displaced »

Bei deinem Code kommt das bei mir raus:
.0^0^0^0^1^1^1^1^56.4-1.75|

Maik81ftl
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?

Beitrag von Maik81ftl »

Displaced hat geschrieben:Bei deinem Code kommt das bei mir raus:
.0^0^0^0^1^1^1^1^56.4-1.75|
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.
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: Debugging - Wie mach ich das richtig?

Beitrag von Displaced »

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

Maik81ftl
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?

Beitrag von Maik81ftl »

Displaced 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...
STimmt der verfluchter Count ^^ immer der selbe :D
Ubuntu 10.04 LTS ist meine Heimat. Lazarus ist meine Sprache :D und der Kreis Segeberg meine LIEBE :D

MmVisual
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?

Beitrag von MmVisual »

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
EleLa - Elektronik Lagerverwaltung - www.elela.de

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: Debugging - Wie mach ich das richtig?

Beitrag von Displaced »

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

martin_frb
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?

Beitrag von martin_frb »

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.
Merkwürdig.

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"

Displaced
Beiträge: 83
Registriert: So 12. Jul 2009, 10:08

Re: Debugging - Wie mach ich das richtig?

Beitrag von Displaced »

Jetzt klappts, mit g und gl klappt das wunderbar. Vielen dank =)

MmVisual
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?

Beitrag von MmVisual »

Wie kann ich die backtrace Info (-gl) zur Laufzeit bei einer Exception auslesen?
EleLa - Elektronik Lagerverwaltung - www.elela.de

Antworten