Project raised Exeption.... "External SIGSEGV"

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Project raised Exeption.... "External SIGSEGV"

Beitrag von mark332 »

Hi Leute,

ich schreibe gerade an einer Komponente für ein Programm, die selbst definierbare Filter, auf ein TextFile anwenden soll.
(Zeilen, die ein Sichwort/Stichsatz enthalten, entfernen)

Um die verschiedenen Filter zu speichern, nutze ich eine StringList ("tFilterIncludes")
Wenn das File vom FTP heruntergeladen wurde, soll es in die StringList ("tFile1") geladen werden,
diese Zeile für Zeile, mit tFilterIncludes abgeglichen, und wenn ein Eine Stelle aus tFilterIncludes gefunden wurde, die Stelle aus tFile1 gelöscht werden.

Mein Problem liegt darin, dass ich in der procedure eine Exeption ("External SIGSEGV") gefeuert wird... :/

Code:

Code: Alles auswählen

 
procedure ApplyFilter();
var
  tFile1: TStringList;
  i, x: integer;
begin
  tFile1 := TStringList.Create;
  tFile1.loadfromFile('logFile.txt');
  for i := 1 to tFile1.Count - 1 do
  begin
    if (tFilterIncludes.Count = 1) or (tFilterIncludes.count>1) then //Hier ist die erste Exeption! (Mit Haltepunkten herausgesucht)
    begin
      for x := 1 to tFilterIncludes.Count - 1 do
      begin
 
        if Pos(tFilterIncludes[x], tFile1[i]) <> 0 then
        begin
          tFile1.Delete(i);
        end;
      end;
    end;
    tFile1.SaveToFile('logFile');
    tFile1.Free;
  end;
end;
 
Da "SIGSEGV" meiner Erfahrung nach eine Zugriffverletzung ist, habe ich folgendes überprüft:
- Sind beide StringListen geladen (bla = TStringList.create;)? -- Ja
- Ist tFilterIncludes Global deklariert? -- Ja (tFilterIncludes: TStringList)

Hat jemand von euch eine Idee, wo das Problem liegen könnte ?

MfG

mark332

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Project raised Exeption.... "External SIGSEGV"

Beitrag von theo »

Ist tFilterIncludes created zum Zeitpunkt der Verwendung?
Gibt es einen Grund, warum du bei 1 und nicht bei O anfängst bei den Listen?

Ganz schlecht ist auch das Löschen in der Schleife.

Code: Alles auswählen

for i := 1 to tFile1.Count - 1 do
...
 tFile1.Delete(i);
Das muss schiefgehen, da du die Elemente die du zugreifst in der for Schleife weglöschst.


Warum

Code: Alles auswählen

if (tFilterIncludes.Count = 1) or (tFilterIncludes.count>1) then 
und nicht einfach

Code: Alles auswählen

if tFilterIncludes.count>0 then 
?

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Project raised Exeption.... "External SIGSEGV"

Beitrag von mark332 »

Danke für deine AW.
 
Gibt es einen Grund, warum du bei 1 und nicht bei O anfängst bei den Listen?
 
Ganz schlecht ist auch das Löschen in der Schleife.

Code: Alles auswählen

 
for i := 1 to tFile1.Count - 1 do
...
 tFile1.Delete(i);
 
 
Stimmt, habe ich garnicht drüber nachgedacht :$, ich werde dann mal...

Code: Alles auswählen

 
procedure ApplyFilter();
var
  tFile1: TStringList;
  i, x: integer;
begin
  tFile1 := TStringList.Create;
  tFile1.loadfromFile('logFile.txt');
  for i := 0 to tFile1.Count - 1 do
  begin
    if tFilterIncludes.Count>0 then
    begin
      for x:=tFilterIncludes.Count-1 downto 0 do
      begin
 
        if Pos(tFilterIncludes[x], tFile1[i]) <> 0 then
        begin
          tFile1.Delete(i);
        end;
      end;
    end;
    tFile1.SaveToFile('logFile');
    tFile1.Free;
  end;
end;
 
...versuchen.

MfG mark332
Zuletzt geändert von Lori am Mo 30. Sep 2013, 12:43, insgesamt 1-mal geändert.
Grund: richtiger Highlighter

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

Re: Project raised Exeption.... "External SIGSEGV"

Beitrag von wp_xyz »

Das wird auch nicht funktionieren, weil du die Stringliste tFile1 in der i-Schleife schon zerstörst. D.h. beim 2. Durchlauf existiert die Liste nicht mehr. Das "Free" gehört ans Ende, wahrscheinlich genauso wie das SaveToFile. Außerdem solltest du alle Speicheranforderungen mit einem "try"-"except" Block schützen, so dass das Speicher wieder freigegeben wird, falls die Programm wegen eines Fehlers nicht bis zum Free kommt. Besser also so:

Code: Alles auswählen

 
procedure ApplyFilter();
var
  tFile1: TStringList;
  i, x: integer;
begin
  tFile1 := TStringList.Create;
  try
    tFile1.loadfromFile('logFile.txt');
    for i := 0 to tFile1.Count - 1 do
    begin
      (*if tFilterIncludes.Count>0 then   // unnötig, da die x-Schleife bei Count=0 übersprungen wird (wegen der for-Bedingung)
      begin*)
        for x:=tFilterIncludes.Count-1 downto 0 do
        begin
 
          if Pos(tFilterIncludes[x], tFile1[i]) <> 0 then
          begin
            tFile1.Delete(i);
          end;
        end;
      //end;
    end;
    tFile1.SaveToFile('logFile');
  finally
    tFile1.Free;
  end;
end;
 
Und schließlich finde ich es als Außenstehender verwirrend, wenn Variablennamen mit einem "t" beginnen. Üblicherweise beginnen damit in Delphi und Lazarus Typ-Deklarationen. Das ist aber keine Grund für die Schutzverletzung, erschwert aber die Lesbarkeit deines Codes für andere.
Zuletzt geändert von wp_xyz am So 29. Sep 2013, 17:01, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 11005
Registriert: Mo 11. Sep 2006, 19:01

Re: Project raised Exeption.... "External SIGSEGV"

Beitrag von theo »

Stimmt, wp_xyz hat noch Probleme gesehen, die mir in allen anderen nicht mal aufgefallen sind.

Sorry mark332, ich will dich nicht runtermachen, aber wenn das kein "Wer findet die 10 Fehler" Test für das Forum war, dann musst du dringend an deiner Sorgfalt arbeiten. So ist es echt krass.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Project raised Exeption.... "External SIGSEGV"

Beitrag von Euklid »

Wenn man in neue Gebiete einsteigt, werden Fehler ziemlich leicht gemacht.

Hier noch ein Tipp:
Mit der HeapTRC-Unit kann man viele der Fehler auch leicht selbst finden. Man kann sie bei Lazarus unter den Projekteinstellungen, dort unter den Linkereinstellungen hinzuschalten.
Startet man das Programm dann von der Konsole aus, werden viele Hinweise dazu gegeben, wo genau die Zugriffsverletzungen passiert sind.

- Euklid

mark332
Beiträge: 202
Registriert: Do 16. Mai 2013, 13:49
OS, Lazarus, FPC: Windows 10 H.P. (x64) / Ubuntu 14.04.X
CPU-Target: AMD Octacore 4.0GHz

Re: Project raised Exeption.... "External SIGSEGV"

Beitrag von mark332 »

Danke für eure AWs,

der Fehler ist jetzt behoben :DD

MfG mark332

PS: das kleine 't' kommt aus lua, da kennzeichnet man Variablen, die mehrere Werte haben (sog. Tables)
Ich persönlich kann dann damit besser umgehen.
------------------------------------------------------------
Warum gibt es hier eigentlich kein [SPOILER][/SPOILER] ?

Antworten