Fehler beim Programmstart mit heaptrc
- Ally
- Beiträge: 278
- Registriert: Do 11. Jun 2009, 09:25
- OS, Lazarus, FPC: Win und Lazarus Stable release
- CPU-Target: x64
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.
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
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.
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
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
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.
Ein erster Schritt wäre Ansicht -> Debuggerfenster -> Aufrufstack dann kann man das Problem schonmal etwas eingrenzen.
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).
- Ally
- Beiträge: 278
- Registriert: Do 11. Jun 2009, 09:25
- OS, Lazarus, FPC: Win und Lazarus Stable release
- CPU-Target: x64
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:
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:
Jetzt funktioniert es mit und ohne heaptrc
Gruß Roland
@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;
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];
Gruß Roland
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Fehler beim Programmstart mit heaptrc
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.Ally hat geschrieben:Im "Normalmodus" läuft das Programm fehlerfrei, also auch der Zugriff auf den nicht vorhandenen Index 4 liefert einen Leerstring ???
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: 278
- Registriert: Do 11. Jun 2009, 09:25
- OS, Lazarus, FPC: Win und Lazarus Stable release
- CPU-Target: x64
Re: Fehler beim Programmstart mit heaptrc
Hallo Michael,
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.
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
Ja, nur mit heaptrc.Ganz sicher nur 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;
Jetzt ist halt die Frage: soll das so sein oder ist das ein Fehler in der Split-Funktion?
Gruß Roland
Re: Fehler beim Programmstart mit heaptrc
Das ist doch kein Fehler... 2 Trennzeichen ergeben 3 Positionen.
Gruß, Michael
Re: Fehler beim Programmstart mit heaptrc
Ich denke, das wäre einen Bug-Report wert.
- Ally
- Beiträge: 278
- Registriert: Do 11. Jun 2009, 09:25
- OS, Lazarus, FPC: Win und Lazarus Stable release
- CPU-Target: x64
Re: Fehler beim Programmstart mit heaptrc
Hallo wp_xyz,
Gruß Roland
Wäre natürlich schön wenn du das mal wieder für mich übernehmen könntest.Ich denke, das wäre einen Bug-Report wert.

Gruß Roland