Announcement

Collapse
No announcement yet.

Problem beim Auswerten von MemCheck

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem beim Auswerten von MemCheck

    Hallo Leute,

    da ich die Befürchtung auf Speicherlöcher in meinem Programm hatte/habe, wollte ich mit MemCeck die Problemstellen herausfinden. Als Ergebnis kam gleich beim Programmstart folgendes heraus:

    <
    MemCheck version 2.70

    Total leak: 1196 bytes

    *** MEMCHK: Blocks STILL allocated ***

    Leak #0 User allocated memory (GetMem)
    Size: 102
    1 Occurence
    call stack - 0 : Routine @Sysutils@Exception@CreateFmt Find error: 0040E1BD
    call stack - 1 : Routine @Sysutils@Exception@CreateFmt Find error: 0040E1B9
    call stack - 2 : (no debug info) Find error: 0040E6D1
    call stack - 3 : Routine @Sysutils@GetExceptionObject Find error: 0040E7CD
    call stack - 4 : Routine @System@@HandleAnyException Find error: 004048B1
    call stack - 5 : (no debug info) Find error: 7C903787
    call stack - 6 : (no debug info) Find error: 7C90EAF6

    Leak #1 User allocated memory (GetMem)
    Size: 16
    1 Occurence
    call stack - 0 : (no debug info) Find error: 0012F0F8
    call stack - 1 : Routine @Sysutils@GetExceptionObject Find error: 0040E7CD
    call stack - 2 : Routine @System@@HandleAnyException Find error: 004048B1
    call stack - 3 : (no debug info) Find error: 7C903787
    call stack - 4 : (no debug info) Find error: 7C90EAF6

    Leak #2 User allocated memory (GetMem)
    Size: 102
    1 Occurence
    call stack - 0 : Routine @Sysutils@Exception@CreateFmt Find error: 0040E1BD
    call stack - 1 : Routine @Sysutils@Exception@CreateFmt Find error: 0040E1B9
    call stack - 2 : (no debug info) Find error: 0040E6D1
    call stack - 3 : Routine @Sysutils@GetExceptionObject Find error: 0040E7CD
    call stack - 4 : Routine @System@@ExceptionHandler Find error: 00404D36
    call stack - 5 : (no debug info) Find error: 7C903787
    call stack - 6 : (no debug info) Find error: 7C90EAF6

    Leak #3 User allocated memory (GetMem)
    Size: 16
    1 Occurence
    call stack - 0 : (no debug info) Find error: 0012F588
    call stack - 1 : Routine @Sysutils@GetExceptionObject Find error: 0040E7CD
    call stack - 2 : Routine @System@@ExceptionHandler Find error: 00404D36
    call stack - 3 : (no debug info) Find error: 7C903787
    call stack - 4 : (no debug info) Find error: 7C90EAF6

    Leak #4 User allocated memory (GetMem)
    Size: 960
    1 Occurence
    call stack - 0 : Routine @System@@ExceptionHandler Find error: 00404CD0
    call stack - 1 : (no debug info) Find error: 7C816D4B
    call stack - 2 : (no debug info) Find error: FFFFFFFC

    *** MEMCHK: End of allocated blocks ***

    *** MEMCHK: Chronological leak information ***

    * User allocated memory (GetMem) (Leak #4) Size: 960
    * User allocated memory (GetMem) (Leak #3) Size: 16
    * User allocated memory (GetMem) (Leak #2) Size: 102
    * User allocated memory (GetMem) (Leak #1) Size: 16
    * User allocated memory (GetMem) (Leak #0) Size: 102

    *** MEMCHK: End of chronological leak information ***

    *** MEMCHK: Blocks written to after destruction ***

    Bad blocks count: 0

    *** MEMCHK: End of blocks written to after destruction ***
    >

    Ich kann jetzt nur nichts damit anfangen.
    Könnte mir jemand bitte einen Hinweis geben?
    Vielen Dank!

    Grüsse Peter

  • #2
    Wie wäre es wenn Du mal TD32-Debug-Infos zu deinem Projekt kompilieren würdest ...

    Comment


    • #3
      Hallo Bernhard,

      danke für den Hinweis, aber das habe ich schon (die Grösse der Exe steigt von ca. 1,7 MB auf 9,7 MB).
      Habe noch folgende Einstellungen:
      Erster Eintrag in der DPR hinter USES ist MemCheck;
      weiter unten erster Eintrag nach begin ist MemChk;
      Unter den Projektoptionen beim Linker habe ich TD32... angeklickt. (MAP-Datei> Aus; Linker-Ausgabe> DCUs erz.; Speichergrößen> $00004000 $00100000 $00400000)
      Unter Compiler:
      Codeerzeugung> Stack-Frames; Syntaxoptionen> Strenge Prüfung..., Erweiterter Syntax, Offene Parameter, Huge-Strings; Laufzeitfehler> Bereichsprüfung, I/O-Prüfung, Überlaufprüfung; Debuggen> Debug-Infos, Lokale Symbole, Referenzinfo inkl.Nur Defs, Assertion

      Die Hauptform wird noch ohne Fehler erzeugt, aber sobald die nächste Form mit Application.CreateForm(TForm4, Form4) erzeugt werden soll, hagelt es nur so von Exceptions/Zugriffsverletzungen.
      Grüsse Pete

      Comment


      • #4
        Hallo Peter,<p>
        viell. hast du ja eine zu alte Version.<br>
        Memcheck hat für jede Delphi-Version eine "optimierte" Version.
        <br>
        Kommt die Exception direkt zur Laufzeit oder nach dem Beenden des Programms ?
        <p>
        Ich hatte damals auch Probleme, weil ich vorher halt memcheck nicht benutzt hatte. er hat mir dann ein "paar" Lecks angezeigt.
        <p>
        Externe Debugsysmbole (D6) sollten auch angeklickt sein.<br>
        Wen du mit "bei Sprachexceptions anhalten" arbeitest, zeigt dir memcheck genau die Stelle an, wo die Exception erzeugt wird.
        <p>
        Heik

        Comment


        • #5
          Auch alle Compiler-Optimierungen ausgeschaltet und Projekt komplett neu erzeugt?

          > Memcheck hat für jede Delphi-Version eine "optimierte" Version.

          Es gibt nur eine Version. Die neueren Versionen können auch mit alten Delphi-Versionen arbeiten.

          > Externe Debugsysmbole (D6) sollten auch angeklickt sein.

          Nicht nötig. Geht mit TD32-Debug-Infos problemlos.

          Aktuell bin ich auf <a href="http://sourceforge.net/projects/fastmm/">FastMM</a> gewechselt. Hat noch ein paar andere Vorteile fürs Debuggen. Man erkennt sofort auch wenn man auf schon freigegebene Objekte/Speicher zugreif

          Comment


          • #6
            Hallo Heiko,

            danke, Du hast mir geholfen. Ich meine, dass es zwar erst vor kurzem war, als ich MemCheck "gezogen" habe, aber es gibt jetzt die Version 2.73 (hatte 2.70), mit der dieses Problem nicht auftritt.
            Hab aber schon wieder etwas gelernt:
            Bevor ich etwas über Drittsoftware poste, erst mal nachsehen, ob es eine neue Version gibt.

            Grüsse Pete

            Comment


            • #7
              Hallo Bernhard,

              habe jetzt erst Deinen Beitrag bemerkt. FastMM4.XX habe ich heute auch schon mehrmals in diversen Foren gelesen und geladen. Nur weiss ich nicht, wie ich damit umgehen soll. Ich habe nur die BorlndMM.pas im BIN-Verzeichnis ausgetauscht, aber wie man damit Speicherlöcher aufspürt konnte ich nirgendwo entdecken.
              Aber manchmal sieht man ja den Wald vor lauter Bäume nicht.
              Hast Du einen Link bzw. Tutorial für FastMM? Oder kannst Du es bitte kurz beschreiben? Vielen Dank im Voraus! Grüsse Pete

              Comment


              • #8
                Ach ja, noch etwas.
                Bin jetzt gerade beim säubern meines Codes bezüglich Speicherlöcher. Musste feststellen, dass MemCheck u.a. eine kommerziell gekaufte Komponente als Verursacher ausmacht. Gehe ich im Quelltext auf die besagte Stelle, wird aber im Quelltext der Kompo ordnungsgemäss im Destruktor das jeweilige Objekt mit FREE freigegeben.
                Hat hier MemCheck einen Fehler?
                Andererseits würde dies auch erklären, warum nach zwei Wochen ununterbrochener Laufzeit das Programm lt. Taskmanager von 9 MB auf 80 MB gewachsen ist.
                Genauer gesagt handelt es sich um die SFTP-Kompos von EldoS (wobei ich jetzt EldoS nicht 100%-ig für das Problem verantwortlich machen möchte). Anmerkung: Das Programm führt alle 2 Min. einen SFTP-Transfer aus, wahrscheinlich deswegen auch der immense Anstieg.
                Nutzt noch jemand anderes diese Kompos und hat vieleicht ähnliche Probleme?

                Grüsse Pete

                Comment


                • #9
                  > Hast Du einen Link bzw. Tutorial für FastMM?

                  Alle Hilfe steht in der Pas und der Include-datei

                  > Hat hier MemCheck einen Fehler?

                  Nein. Vermutlich wird die Komponente intern irgendwelche Objekte/Speicherbereiche nicht korrekt freigeben die es während des Transfers anfordert

                  Comment


                  • #10
                    Hallo Bernhard,
                    danke für Deine Antwort. Na, dann bleibt mir nichts anderes übrig, als die PAS- und INC-Dateien durchzusehen ;o))))
                    &lt;
                    Auszug aus der MemCheck-Ergebnisdatei:
                    call stack - 0 : Module SBSftpCommon.pas Routine @Sbsftpcommon@TElSftpFileAttributes@Create Line 548 Find error: 004E8B4A

                    Und jetzt der Auszug aus der Quelldatei:
                    constructor TElSftpFileAttributes.Create;
                    begin
                    inherited;
                    FIncludedAttributes := [];
                    FACEs := TList.Create;
                    FExtendedAttributes := TList.Create; //Das ist die Zeile 548
                    end;

                    destructor TElSftpFileAttributes.Destroy;
                    begin
                    ClearACEs;
                    FACEs.Free;
                    ClearExtendedAttributes;
                    FExtendedAttributes.Free;
                    inherited;
                    end;

                    Es wird doch sauber FExtendedAttributes wieder freigegeben.
                    In dem ClearExtendedAttributes steht dann nochmal (auszugsweise) das
                    for i := 0 to FExtendedAttributes.Count - 1 do
                    TSBSftpExtendedAttribute(FExtendedAttributes.Items[i]).Free;
                    FExtendedAttributes.Clear;

                    Für mich sieht das ganz gut aus, oder habe ich einen Gedankenfehler?
                    &gt;

                    Kann noch jemand weiterhelfen? Danke!
                    Grüsse Pete

                    Comment


                    • #11
                      Werden auch nicht mehr TElSftpFileAttributes erzeugt als zum schluß wieder freigegeben.
                      Was wird sonst im Code mit FExtendedAttributes gemacht. Evtl. gibt es ja irgendwo einen direkten FExtendedAttributes.Clear-Aufruf

                      Comment


                      • #12
                        Hallo Bernhard,

                        ich habe jetzt bei EldoS das Problem per Mail geschildert und warte mal ab. Ich habe EldoS die Logdatei zukommen lassen, die ausgespuckt wurde, als ich mit ihrem Beispielprojekt einen SFTP-Transfer durchführte.
                        Werde das Ergebnis noch posten, wenn ich es erhalte.

                        Grüsse Pete

                        Comment


                        • #13
                          Hallo Bernhard,

                          Du hattest natürlich recht mit "...Werden auch nicht mehr TElSftpFileAttributes erzeugt als zum schluß wieder freigegeben."
                          Nur dass die (Mehr-)Erzeugung von TElSftpFileAttributes eben nicht in der Unit der Kompo war, sondern in meinem Projekt bzw. auch in dem Beispielprojekt "SimpleSftpDemo.dpr" von EldoS (habe hier auch noch mit MemCheck geprüft -> gleicher Fehler).
                          EldoS hat übrigens gestern gegen 17.00 mit der Lösung geantwortet:
                          &lt;
                          Thank you very much for your information.

                          We have investigated the problem and came to the following conclusion. The
                          problem really does exist, but it is a problem not of SecureBlackbox
                          classes, but of incorrect usage of them. The leaks are caused by
                          ElSftpFileInfo objects returned by ElSimpleSftpClient.ReadDirectory event.
                          These objects are not destroyed by ElSimpleSftpClient and *must* be freed by
                          user application.

                          It is our fault, since we did not describe this in documentation, and the
                          objects are not freed in the demo application. We are very sorry for this
                          inconvenience.

                          Adding the following line to the TfrmMain.Refresh function of the
                          SimpleSftpDemo will prevent the leak:
                          ------cut------
                          ...
                          for I := 0 to dirList.Count - 1 do
                          begin
                          Info := TElSftpFileInfo.Create;
                          TElSftpFileInfo(dirList.Items[I]).CopyTo(Info);
                          // the following line must be added:
                          TElSftpFileInfo(dirList.Items[I]).Free;
                          Item := lvFiles.Items.Add;
                          ...
                          ------cut------

                          Once again, thank you for pointing us at this problem.
                          &gt;

                          Grüsse Pete

                          Comment

                          Working...
                          X