Delphi-PRAXiS
Seite 7 von 7   « Erste     567   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriffsverletzung beim Zerstören der TIniFile-Instanz (https://www.delphipraxis.net/206756-zugriffsverletzung-beim-zerstoeren-der-tinifile-instanz.html)

stahli 2. Feb 2021 16:05

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
 
Zitat:

Zitat von TheSledgeHammer (Beitrag 1481994)
Ok, d.h. ich hab offenbar tatsächlich keine MemLeaks? :shock:

Bau doch mal testweise einen ein.
Dann weißt Du zumindest, ob sowas korrekt gefunden wird.

jaenicke 2. Feb 2021 17:53

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
 
Wenn FastMM auch nichts findet, bleibt nur mit Logs zu analysieren... z.B. den Speicher des Objekts nach der Erzeugung als Dump loggen und dann bei der Freigabe, ...
Das ist nicht schön, aber solche Fehler sind leider nicht so einfach zu finden.

himitsu 2. Feb 2021 19:31

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
 
Das volle FastMM kann bei Speicherfreigabe den Speicher überschreiben (mit einem Muster markieren)
so würde z.B. eine Doppelfreigabe oder ein Zugriff nach der Freigabe auffallen.
-> Man müsste nur noch das entgültige Freigeben ein bissl verzögern, damit auch freigegebener und inzwischen wiederverwendeter Speicher in diese Prüfung fallen.

Gegen sowas wie Buffer-Overrun oder komplett falsche/ungültige Zeiger kann man sich aber nicht wirklich wehren.


Und ja, möglich wäre es viele Wichtige oder gleich alle Speicheranforderungen/-freigaben in ein Log schreiben zu lassen.
Wenn es dann später knallt, dann kann man z.B. schauen was vorher alles an der Stelle mal war.

Blup 3. Feb 2021 10:06

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
 
Zitat:

Zitat von TheSledgeHammer (Beitrag 1481614)
Delphi-Quellcode:
procedure TFormDynamicSearchDialog.LoadIni;
var
  iniFile: TIniFile;
  sec: String;
begin

  if FIniFile <> '' then
  begin

    sec := 'Search';

    iniFile := nil;

    try

      iniFile := TIniFile.Create(FIniFile);

      miSqlLinkCmdAnd.Checked := iniFile.ReadBool(sec, miSqlLinkCmdAnd.Name, true);
      miSqlLinkCmdOr.Checked := iniFile.ReadBool(sec, miSqlLinkCmdOr.Name, false);

      if miSqlLinkCmdAnd.Checked then
        FSqlLinkCmd := slcAnd
      else if miSqlLinkCmdOr.Checked then
        FSqlLinkCmd := slcOr;

      case iniFile.ReadInteger(sec, pcMain.Name, 1) of
        0: tbFavourites.Click;
        1: tbExpert.Click;
        2: tbFavourites.Click;
      end;

    finally
      if iniFile <> nil then
        iniFile.Free;
    end;

  end else
  begin
    // if no INI has been defined, set SQL link command as default here
    miSqlLinkCmdAND.Checked := true;
    FSqlLinkCmd := slcAnd;
  end;

end;
Und bei dem "ShowModal" sollte man sich nicht verwirren lassen :) Das muss ich aber glaub genauer erklären. Im Interface zur Dll (Unit-Name "DynamicSearchDialogDllInterface") gibt es eine Methode, die "ShowModal" heißt. Diese wiederum ruft die aus der DLL exportierte Methode "ShowModal" auf (Unit-Name "DynSearchDialog"). Und in dieser Methode wird dann das tatsächliche "ShowModal" des TForm-Objekts aufgerufen (Unit-Name "DynamicSearchDialog"). D.h. ShowModal wird tatsächlich nur einmal aufgerufen, allerdings gibt es davor noch andere Methoden, die halt exakt so heißen. Hat was mit der Integration zu tun, ich wollte halt nicht, dass alle Entwickler ihren Code anpassen müssen, wenn sie auf die DLL umsteigen wollen; oder zumindest nur ganz gering anpassen müssen :P

Das Fehlerprotokoll zeigt eindeutig den rekursiven Aufruf von TDynamicSearchDialog.ShowModal und TFormDynamicSearchDialog.LoadIni.
Ausgelöst in TFormDynamicSearchDialog.LoadIni durch die Zeile "tbExpert.Click;".

TheSledgeHammer 3. Feb 2021 13:26

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
 
Ja, eines dieser Fehlerprotokolle zeigt eine Rekursion, da geb ich dir Recht. Ich hab aber genau so viele Berichte mit Rekursion, wie solche, bei denen der Fehler nicht rekursiv geschieht, sondern wo es direkt beim ShowModal knallt. Ich hab - zugegeben - nicht geschaut, welchen Bericht ich da jetzt genommen hab, weil die Zeile, wo es knallt, exakt identisch ist. Ich kann dir aber beim besten Willen nicht sagen, warum in diesem Dump eine Rekursion enthalten ist... LoadIni() wird nur einmal aufgerufen...

TheSledgeHammer 3. Feb 2021 13:39

AW: Zugriffsverletzung beim Zerstören der TIniFile-Instanz
 
Zitat:

Zitat von jaenicke (Beitrag 1482053)
Wenn FastMM auch nichts findet, bleibt nur mit Logs zu analysieren... z.B. den Speicher des Objekts nach der Erzeugung als Dump loggen und dann bei der Freigabe, ...
Das ist nicht schön, aber solche Fehler sind leider nicht so einfach zu finden.

Ja, das klingt fast so als wäre das nötig. Kannst du mir erklären wie ich das machen kann? Oder hast du ne Anleitung im WWW, die was taugt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:14 Uhr.
Seite 7 von 7   « Erste     567   

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