Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Memory Leaks im Webservice (Unter iOS & Android) (https://www.delphipraxis.net/192743-memory-leaks-im-webservice-unter-ios-android.html)

junglist 16. Mai 2017 12:54

Memory Leaks im Webservice (Unter iOS & Android)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen

Mein WebService-Aufruf tut mir immer grosse Memory Leaks machen, wodurch meine App nicht länger als ein paar Stunden im Background bleiben kann. (Was wichtig ist)
Schon nur das Login und Logout lassen Leaks entstehen lassen.
Das WSDL habe ich in Delphi mit dem Wizard importiert.

In den xCode-Instruments habe ich dann einen Haufen an "malloc"-Einträgen, aber ich weiss nicht was ich mit denen tun soll.

Ich weiss nicht, was ich nicht gefreet habe oder sonswie am Leben habe laufen lassen, hat jemand eine Idee?
Danke.


Delphi-Quellcode:
procedure TDataModule.SOAPLogin();
var
  loginRes:loginResponse;
  WSLogin:login;
begin
  WSLogin := login.Create;
  WSLogin.user := user;
  WSLogin.password := passwort;
  WSLogin.domain := '';

  sess := sessionHeader.Create;
  try
    try
      WSInterface := GetWSInterface(true, '');

      loginRes := WSInterface.login(WSLogin);
      sess.sessionId := loginRes.sessionId;

      (WSInterface as ISOAPHeaders).Send(sess);
      except on E:Exception do
      begin
        TfgToast.Show('SOAPLogin ist fehlgeschlagen.')
      end;
    end;
  finally
    WSLogin.Free;
    loginRes.Free;
  end;
end;


procedure TDataModule.SOAPLogout();
var
  WSLogout:logout;
  logoutRes:logoutResponse;
begin
  WSLogout := logout.Create;
  try
    if sess.sessionId <> '' then
    begin
      try
        WSLogout.sessionId := sess.sessionId;
        logoutRes := WSInterface.logout(WSLogout);
        except on E:Exception do
        begin
          TfgToast.Show('SOAPLogout ist fehlgeschlagen.')
        end;
      end;
    end;

  finally
    WSLogout.Free;
   
    if Assigned(sess) then
      sess.Free;
    
    if Assigned(logoutRes) then
      logoutRes.Free;

    WSInterface := nil;
  end;
end;

Union 16. Mai 2017 13:16

AW: Memory Leaks im Webservice (Unter iOS & Android)
 
Was ist mit sess ?

DeddyH 16. Mai 2017 13:19

AW: Memory Leaks im Webservice (Unter iOS & Android)
 
In der Logout-Routine:
Zitat:

Delphi-Quellcode:
if Assigned(sess) then
      sess.Free;


junglist 16. Mai 2017 13:41

AW: Memory Leaks im Webservice (Unter iOS & Android)
 
Genau, sess (sessionHeader) und WSInterface sind als Properties vom Datamodule definiert, damit von beiden Funktionen aus darauf zugegriffen werden kann.

Im Login wird sess initialisiert, und im Logout wieder freigegeben.

Thomas Horstmann 16. Mai 2017 13:56

AW: Memory Leaks im Webservice (Unter iOS & Android)
 
Unter ARM (iOS und Android) sollte ".DisposeOf" statt ".Free" verwendet werden.

junglist 16. Mai 2017 14:13

AW: Memory Leaks im Webservice (Unter iOS & Android)
 
Zitat:

Zitat von Thomas Horstmann (Beitrag 1371615)
Unter ARM (iOS und Android) sollte ".DisposeOf" statt ".Free" verwendet werden.

Habe ich schon gelesen und versucht. (Auch wenn nicht ganz genau aufgepasst, mit DisposeOf auf den login, logout und sess habe ich "nur" noch 400-500 Leaks statt 900 pro Login- und Logout Routine. Also danke schonmal :-D)

SneakyBagels 16. Mai 2017 14:16

AW: Memory Leaks im Webservice (Unter iOS & Android)
 
Zitat:

login, logout und sess habe ich "nur" noch 400-500 Leaks statt 900 pro Login- und Logout Routine.
Dann läuft da aber grundsätzlich irgendwas sehr schief bei dir.

junglist 16. Mai 2017 14:59

AW: Memory Leaks im Webservice (Unter iOS & Android)
 
Zitat:

Zitat von SneakyBagels (Beitrag 1371623)
Zitat:

login, logout und sess habe ich "nur" noch 400-500 Leaks statt 900 pro Login- und Logout Routine.
Dann läuft da aber grundsätzlich irgendwas sehr schief bei dir.

Meinst du?

1) Neues Projekt
2) WSDL-Datei importieren und WSDL-Datei in Bereitstellung tun
3) openSSL-Dateien in Bereitstellung reintun
4) DataModule mit SOAPLogin und SOAPLogout
5) ButtonClick

Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
var
  cn: TDataModule;
begin
  cn := TDataModule.Create(nil);
  try
    cn.SOAPLogin;
    cn.SOAPLogout;
    ShowMessage('done');
  finally
    cn.Free;
  end;
end;
^ Gibt mir immer noch 400-500 Leaks pro Click (In xCode Instruments!! Ich weiss nicht, ob das bei "einem Leak mehr anzeigt")



Was kann denn falsch sein, die importierte WSDL-Datei, die Art wie ich den Webservice aufrufe, oder..?

junglist 17. Mai 2017 14:04

AW: Memory Leaks im Webservice (Unter iOS & Android)
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ich habe in den Bildern eine Aufzeichnung von n paar Memory Leaks in xCode.

Das wäre doch eine zirkuläre Referenz, nicht?
Kann ich da jetzt etwas machen, wenn das in Indy's Komponenten (TIdSSLContext und TIdSSLSocket wie auf dem Bild z.B.) ist, ausser einfach die Dateien zu kopieren und zu verändern?

Oder bin ich komplett auf dem falschen Weg?

junglist 22. Mai 2017 15:46

AW: Memory Leaks im Webservice (Unter iOS & Android)
 
Delphi-Quellcode:
function TDataModule.getWeatherCities:string;
var
  WSInterface: GlobalWeatherSoap;
begin
  WSInterface := GetGlobalWeatherSOAP;
  result := WSInterface.GetCitiesByCountry('Switzerland');
  WSInterface := nil;
end;


procedure TForm2.Button1Click(Sender: TObject);
var
  cn: TDataModule;
  cities:string;
begin
  cn := TDataModule.Create(nil);
  try
    cities := cn.GetWeatherCities;
    Memo1.Lines.Add(cities);
    Button1.Text := BUtton1.Text + 'done';
  finally
    cn.DisposeOf;
  end;
end;
Webservice: http://www.service-repository.com/se...ew/-2082028434

Hiermit gibt es keine Leaks. Kann ich also sicher davon ausgehen, dass der Leak irgendwo in den SSL-Units passiert? Schliesslich passiert das erst wenn ich einen SessionHeader mache und vor jedem Call schicke.

Bin im Moment ratlos, was ich denn tun könnte, ausser zu versuchen die SSL-Units zu "fixen"? (Was für mich wohl nicht in 'nem Tag gemacht wäre)


Grüsse


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:57 Uhr.
Seite 1 von 2  1 2      

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