Fehler beim Programmstart mit heaptrc

Für Fragen rund um die Ide und zum Debugger
Antworten
Ally
Beiträge: 160
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: 32 und 64 Bit

Fehler beim Programmstart mit heaptrc

Beitrag von Ally »

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

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 652
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Fehler beim Programmstart mit heaptrc

Beitrag von fliegermichl »

Das kann man so pauschal nicht sagen.

Ein erster Schritt wäre Ansicht -> Debuggerfenster -> Aufrufstack dann kann man das Problem schonmal etwas eingrenzen.

wp_xyz
Beiträge: 3329
Registriert: Fr 8. Apr 2011, 09:01

Re: Fehler beim Programmstart mit heaptrc

Beitrag von wp_xyz »

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

Ally
Beiträge: 160
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: 32 und 64 Bit

Re: Fehler beim Programmstart mit heaptrc

Beitrag von Ally »

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

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 652
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.7 FPC 3.04)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Fehler beim Programmstart mit heaptrc

Beitrag von fliegermichl »

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

Ally
Beiträge: 160
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: 32 und 64 Bit

Re: Fehler beim Programmstart mit heaptrc

Beitrag von Ally »

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

Benutzeravatar
six1
Beiträge: 217
Registriert: Do 1. Jul 2010, 19:01

Re: Fehler beim Programmstart mit heaptrc

Beitrag von six1 »

Das ist doch kein Fehler... 2 Trennzeichen ergeben 3 Positionen.
Gruß, Michael

wp_xyz
Beiträge: 3329
Registriert: Fr 8. Apr 2011, 09:01

Re: Fehler beim Programmstart mit heaptrc

Beitrag von wp_xyz »

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

Ally
Beiträge: 160
Registriert: Do 11. Jun 2009, 09:25
OS, Lazarus, FPC: Win und Lazarus Stable release
CPU-Target: 32 und 64 Bit

Re: Fehler beim Programmstart mit heaptrc

Beitrag von Ally »

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

Antworten