Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Problem mit D2009 und IdFTP (https://www.delphipraxis.net/146738-problem-mit-d2009-und-idftp.html)

fealXX 26. Jan 2010 11:31


Problem mit D2009 und IdFTP
 
Hi!
Folgendes Problem:
Ich lade eine Datei hoch bei Uploaded.to, via FTP.
Das klappt ein paar mal, irgendwann gibt es aber eine Access Violation -> Lesen von Adresse 0000000
Das kuriose ist, unter Windows XP konnte ich diesen Fehler nicht Reproduzieren, nur unter Windows 2003 tritt er auf.
Ich kann auch keine Regelmässigkeit dabei erkennen *grübel*

Delphi-Quellcode:
      ftp:= tidftp.Create;
   try
              list:=tstringlist.create;
              name := ExtractFileName(form3.listview1.Items[listviewind].Caption);
              Ftp.Host:='ftp.uploaded.to';
              Ftp.Username:=Form4.Edit13.text;
              Ftp.Password:=Form4.Edit12.text;
              Ftp.Passive:=true;
              Ftp.Connect();
              Ftp.ChangeDir('/');
              Ftp.Put(form3.listview1.Items[listviewind].Caption,name);
              Ftp.list(list);
              arr1 := explode(name+' ',list.text);
              arr2 := explode(#13#10,arr1[1]);
              while(arr2[0] = '') do
              begin
                list.Clear;
                Ftp.list(list);
                arr1 := explode(name+' ',list.text);
                arr2 := explode(#13#10,arr1[1]);
              end;
              tmp1:='http://ul.to/'+arr2[0];
              Ftp.Disconnect;
         list.Free;
    except
                 on E : Exception do
                 begin
                   ShowMessage('FTPException class name = '+E.ClassName);
                   ShowMessage('FTPException message = '+E.Message);
                 end;
   end;
        ftp.Free;

DeddyH 26. Jan 2010 11:38

Re: Problem mit D2009 und IdFTP
 
Zum Einen sollte man dynamisch erzeugte Objekte immer in try-finally einbetten, um Speicherlecks zu vermeiden.
Delphi-Quellcode:
Bla := TBla.Create;
try
  //Mach was mit Bla
finally
  Bla.Free;
end;
Dann greifst Du auf Elemente der Arrays(?) arr1 und arr2 zu, ohne vorher zu prüfen, ob diese überhaupt befüllt sind. Ansonsten zeig uns doch einmal, in welcher Zeile die Exception auftritt.

fealXX 26. Jan 2010 11:49

Re: Problem mit D2009 und IdFTP
 
Zitat:

Zitat von DeddyH
Zum Einen sollte man dynamisch erzeugte Objekte immer in try-finally einbetten, um Speicherlecks zu vermeiden.
Delphi-Quellcode:
Bla := TBla.Create;
try
  //Mach was mit Bla
finally
  Bla.Free;
end;
Dann greifst Du auf Elemente der Arrays(?) arr1 und arr2 zu, ohne vorher zu prüfen, ob diese überhaupt befüllt sind. Ansonsten zeig uns doch einmal, in welcher Zeile die Exception auftritt.

In welcher Zeile die Exception auftritt weiss ich leider nicht, wie gesagt, unter Windows XP (mein Homerechner, wo ich entwickle) ist der Fehler nicht reproduzierbar, während er unter Win 2003 (Server) auftritt.

Die Try Finally existieren schon, hab nur das aus dem code rauskopiert wo das problem liegen muss.

Kann das an einem Leeren Array liegen das es eine Exception "Lesen von Adresse 00000" auftritt?
Die Explode funktion hab ich hier aus der CodeLibrary wenn ich mich recht erinnere:
Delphi-Quellcode:
function Explode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;
var
  SepLen: Integer;
  F, P: PChar;
  ALen, Index: Integer;
begin
  SetLength(Result, 0);
  if (S = '') or (Limit < 0) then Exit;
  if Separator = '' then
  begin
    SetLength(Result, 1);
    Result[0] := S;
    Exit;
  end;
  SepLen := Length(Separator);
  ALen := Limit;
  SetLength(Result, ALen);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
    P := AnsiStrPos(P, PChar(Separator));
    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F);
    if Index >= ALen then
    begin
      Inc(ALen, 5);
      SetLength(Result, ALen);
    end;
    SetString(Result[Index], F, P - F);
    Inc(Index);
    if P^ <> #0 then Inc(P, SepLen);
  end;
  if Index < ALen then SetLength(Result, Index);
end;

DeddyH 26. Jan 2010 11:53

Re: Problem mit D2009 und IdFTP
 
Versuch doch erst einmal, die Längen der Arrays zu prüfen, bevor Du zugreifst.
Delphi-Quellcode:
if Length(arr2) > 0 then
  while(arr2[0] = '') do
Das dann an allen entsprechenden Stellen, an denen die Arrays vor erneutem Zugriff geändert wurden.

fealXX 26. Jan 2010 12:14

Re: Problem mit D2009 und IdFTP
 
Hab ich nun gemacht, ändert leider nichts =/

DeddyH 26. Jan 2010 12:19

Re: Problem mit D2009 und IdFTP
 
Dann gehen mir auch so langsam die Ideen aus, da ja auch die fehlerverursachende Zeile nicht bekannt ist. Die Speicheradresse in der Fehlermeldung deutet zumindest darauf hin, dass auf ein nicht instanziertes Objekt zugegriffen werden soll oder etwas in der Art.

fealXX 26. Jan 2010 12:28

Re: Problem mit D2009 und IdFTP
 
Zitat:

Zitat von DeddyH
Dann gehen mir auch so langsam die Ideen aus, da ja auch die fehlerverursachende Zeile nicht bekannt ist. Die Speicheradresse in der Fehlermeldung deutet zumindest darauf hin, dass auf ein nicht instanziertes Objekt zugegriffen werden soll oder etwas in der Art.

Ich danke dir trotzdem, das komische ist ja, Zuhause klappts, auf dem Server nicht ._.!
Ist dir vllt eine Methode bekannt die Fehlerverursachende zeile nach dem Compilieren, also ausserhalb der IDE herauszufinden?

DeddyH 26. Jan 2010 12:33

Re: Problem mit D2009 und IdFTP
 
Spontan fällt mir da MadExcept ein.

GHorn 26. Jan 2010 12:47

Re: Problem mit D2009 und IdFTP
 
... oder alle Schritte in einer Log-Datei mitprotokollieren. Zwischen dem
letzten geschriebenen und dem nächsten nicht mehr protokollierten liegt
der Hase im Pfeffer.

Wenn die Aktionen manuell gestartet werden, also keine While-Schleife, kannst
Du das auch über ShowMessage(..) eingrenzen.

Außerdem würde ich keine geschützten Begriffe wie "name" oder "index" als
Variablenbezeichnung einsetzen. Besser wäre z.B. "sName" oder "iIndex" o.ä.

fealXX 26. Jan 2010 19:09

Re: Problem mit D2009 und IdFTP
 
Ist gelöst, worans nun wirklich lag kann ich aber leider nicht sagen^^
Einen Tag lang rumprobieren hat geholfen^^


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz