Fehler beim Programmstart mit heaptrc

Für Fragen rund um die Ide und zum Debugger

Fehler beim Programmstart mit heaptrc

Beitragvon Ally » 17. Mai 2019, 12:19 Fehler beim Programmstart mit heaptrc

Hallo zusammen,

ich habe mal meine Programme mit heaptrc gestartet und bei einem gibt es ein Problem.

Beim Start aus der IDE heraus kommt folgender Fehler:
Das Programm hat Exception-Klasse >External: SIGSEGV< ausgelöst.
Danach öffnet sich das Assemblerfenster und das Programm startet nicht.

Fehler.jpg


Wenn ich das Programm dann außerhalb der IDE direkt starte, läuft es einwandfrei und gibt mir beim Beenden auch die Meldung zurück, dass der Speicher wieder komplett freigegeben wurde.
Das ganze unter Windows 10 und Lazarus 2.0.2 (64 Bit) - fpc-3.0.4 (Zielplattform: Win 32 / i386)

Muss ich mir Gedanken machen oder gibt es dafür eine Erklärung?

Gruß Roland
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Ally
 
Beiträge: 98
Registriert: 11. Jun 2009, 08:25

Beitragvon fliegermichl » 17. Mai 2019, 13:08 Re: Fehler beim Programmstart mit heaptrc

Das kann man so pauschal nicht sagen.

Ein erster Schritt wäre Ansicht -> Debuggerfenster -> Aufrufstack dann kann man das Problem schonmal etwas eingrenzen.
fliegermichl
 
Beiträge: 312
Registriert: 9. Jun 2011, 08:42

Beitragvon wp_xyz » 17. Mai 2019, 14:42 Re: Fehler beim Programmstart mit heaptrc

Ich weiß nicht, ob sich das so auswirkt, und ich weiß auch nicht, ob du das gemacht hast, aber man darf heaptrc nur über das Häkchen in den Projekt-Optionen aktivieren, nicht aber indem man die Unit in der Uses-Liste aufführt (http://wiki.freepascal.org/heaptrc#Why_ ... e_manually).
wp_xyz
 
Beiträge: 2889
Registriert: 8. Apr 2011, 08:01

Beitragvon Ally » 17. Mai 2019, 16:27 Re: Fehler beim Programmstart mit heaptrc

Danke für eure Hilfe.

@wp_xyz: ja ich habe heaptrc nur über das Häkchen in den Projekt-Optionen aktiviert. Früher musste man ja wohl die Unit einbinden.

@fliegermichl: dein Tipp mit dem Aufrufstack hat mich auf die richtige Spur gebracht.

Der eigentliche Auslöser war, wenn man das so sagen kann, die Split-Funktion.
Hier ein Beispiel:

Code: Alles auswählen
var
  DateiEin: TextFile;
  Zeile: String;
  Spalte: TStringArray;
begin
  .
  .
  while not EOF(DateiEin) do
  begin
    Readln(DateiEin, Zeile);    // Einen Buchungssatz aus der Datei lesen
    Spalte := Zeile.Split(';'); // und in seine Einzelteile zerlegen
 
    // Soll- Habenkennzeichen auslesen
    SoHa := Spalte[0];
    // Betrag auslesen
    IBetrag := (Spalte[1]);
    // Kontonummer auslesen
    Konto := Spalte[2];      // wenn leer, kein Fehler, Konto wird Leersting
    .
    .
    // Text auslesen
    Textfeld := Spalte[4];   // wenn leer, Fehler, Spalte[4] gibts nicht
end;
 

Ein leeres Feld in der Mitte des StringArray wird als Leerstring zurückgegeben.
Ist aber das letzte Feld leer, wird erst gar kein Array-Eintrag erzeugt.

Interessanterweise tritt der Fehler nur unter heaptrc auf.
Im "Normalmodus" läuft das Programm fehlerfrei, also auch der Zugriff auf den nicht vorhandenen Index 4 liefert einen Leerstring ???

Gelöst hab ich das Ganze jetz so:

Code: Alles auswählen
  // Text auslesen
  if High(Spalte) = 3 then        // wenn das letzte Feld leer ist hat <Spalte> nur 4 Felder (Index 3)
    Textfeld := ''                // der Zugriff auf Spalte[4] führt dann unter heaptrc zu einem >External: SIGSEGV<
  else
    Textfeld := Spalte[4];
 

Jetzt funktioniert es mit und ohne heaptrc


Gruß Roland
Ally
 
Beiträge: 98
Registriert: 11. Jun 2009, 08:25

Beitragvon fliegermichl » 18. Mai 2019, 09:09 Re: Fehler beim Programmstart mit heaptrc

Ally hat geschrieben:Im "Normalmodus" läuft das Programm fehlerfrei, also auch der Zugriff auf den nicht vorhandenen Index 4 liefert einen Leerstring ???


Ganz sicher nur heaptrc? Im Debugmodus sollte hier auch die Bereichsprüfung Alarm schlagen. Das sind ganz fiese Fehler die nur schwer zu finden sind.
Ich hab mir angewöhnt im Debugmodus sämtliche Prüfungen zu aktivieren und auch Compilerwarnungen nicht zu ignorieren. Das kann einem u.U. verdammt viel Zeit bei der Fehlersuche ersparen.

Gruß
Michael
fliegermichl
 
Beiträge: 312
Registriert: 9. Jun 2011, 08:42

Beitragvon Ally » 18. Mai 2019, 10:38 Re: Fehler beim Programmstart mit heaptrc

Hallo Michael,

Ganz sicher nur heaptrc?


Ja, nur mit heaptrc.

Du hast recht, wenn man die Bereichsprüfung aktiviert, meckert die auch.
Das Ganze passiert aber nur, wenn der zu splittende String mit dem Trennzeichen endet.

Mit dem folgenden Beispiel kann man das schön ausprobieren.

Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
var
  Zeile: String;
  Spalte: TStringArray;
begin
  //Zeile := 'F0;F1;F2';  // High(Spalte) = 2 = Ok
  //Zeile := ';F1;F2';    // High(Spalte) = 2 = Ok
  //Zeile := ';;F2';      // High(Spalte) = 2 = Ok
  //Zeile := 'F0;;F2';    // High(Spalte) = 2 = Ok
 
  //Zeile := ';;';        // High(Spalte) = 1 = Falsch
  //Zeile := 'F0;F1;';    // High(Spalte) = 1 = Falsch
  //Zeile := 'F0;;';      // High(Spalte) = 1 = Falsch
  Zeile := ';F1;';      // High(Spalte) = 1 = Falsch
 
  Spalte := Zeile.Split(';');
 
  LabelSpaltenIndex.Caption := IntToStr(High(Spalte));
 
  Label_Index_0.Caption := Spalte[0];
  Label_Index_1.Caption := Spalte[1];
  Label_Index_2.Caption := Spalte[2];
end;


Meiner Meinung nach sollte Split bei einem String mit zwei Trennzeichen, drei Strings zurück liefern, auch wenn der Letzte ein Leerstring ist.
Jetzt ist halt die Frage: soll das so sein oder ist das ein Fehler in der Split-Funktion?


Gruß Roland
Ally
 
Beiträge: 98
Registriert: 11. Jun 2009, 08:25

Beitragvon six1 » 18. Mai 2019, 11:33 Re: Fehler beim Programmstart mit heaptrc

Das ist doch kein Fehler... 2 Trennzeichen ergeben 3 Positionen.
six1
 
Beiträge: 66
Registriert: 1. Jul 2010, 18:01

Beitragvon wp_xyz » 18. Mai 2019, 11:39 Re: Fehler beim Programmstart mit heaptrc

Ich denke, das wäre einen Bug-Report wert.
wp_xyz
 
Beiträge: 2889
Registriert: 8. Apr 2011, 08:01

Beitragvon Ally » 18. Mai 2019, 11:58 Re: Fehler beim Programmstart mit heaptrc

Hallo wp_xyz,

Ich denke, das wäre einen Bug-Report wert.


Wäre natürlich schön wenn du das mal wieder für mich übernehmen könntest. :wink:


Gruß Roland
Ally
 
Beiträge: 98
Registriert: 11. Jun 2009, 08:25

• Themenende •

Zurück zu Benutzung der IDE



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 Gäste

porpoises-institution
accuracy-worried