Speicherverbrauch meiner Anwendung feststellen



  • Hallo Zusammen,

    ich frage mich schon seit längerem, ob es nicht eine Möglichkeit gibt zur Laufzeit eines Programmes feststellen, wie hoch der Speicherverbrauch meiner Anwendung ist.

    Und zwar habe ich ein Kommandozeilenprogramm, daß eine Dll testet.
    Ich würde gerne auch feststellen, wenn ein Speicherleak in der Dll wäre. Meine Vorstellung wäre, ich frage den benutzen Speicher meines Prozesses ab, und vergleiche Anfang mit Ende.

    Geht sowas und wenn ja wie?

    Danke



  • Da wirst du sicher auf CodeProject.com fündig. Da gibt es bestimmt Programme, bei denen du dir das abgucken kannst.

    Vielleicht sowas hier?

    http://www.codeproject.com/KB/system/advancedtaskmanager.aspx



  • GetProcessMemoryInfo und dort speziell "PagefileUsage"



  • valgrind ist z.B. das Tool schlechthin (finde ich). Der Speicherverbrauch als auch leaks werden aber erst nach dem Beenden des Programms angezeigt.



  • knivil schrieb:

    valgrind ist z.B. das Tool schlechthin (finde ich). Der Speicherverbrauch als auch leaks werden aber erst nach dem Beenden des Programms angezeigt.

    Er ist in der WinAPI Sektion, wie kann man ein Tool vorschlagen das nur auf *nix systemen läuft? ..



  • knivil schrieb:

    valgrind ist z.B. das Tool schlechthin (finde ich). Der Speicherverbrauch als auch leaks werden aber erst nach dem Beenden des Programms angezeigt.

    http://www.pic-upload.de/23.03.09/fgra5q.jpg



  • Naja, Cygwin und Co, wenns kein Port gibt. Gibt es anscheined nicht, Pech gehabt. Ausserdem: Nicht-betriebssytemspezifische Teile auslagern und irgendwo anders Testen. Oder eigenes new/delete bzw. malloc/free anbieten, dass die Aufrufe als auch die angeforderten Bytes protokolliert. Ist auch nicht schwer, da die eigentliche Aufrufe ja nur an die richtigen new/delete malloc/free weitergeleitet werden muessen.



  • knivil schrieb:

    Naja, Cygwin und Co, wenns kein Port gibt. Gibt es anscheined nicht, Pech gehabt. Ausserdem: Nicht-betriebssytemspezifische Teile auslagern und irgendwo anders Testen. Oder eigenes new/delete bzw. malloc/free anbieten, dass die Aufrufe als auch die angeforderten Bytes protokolliert. Ist auch nicht schwer, da die eigentliche Aufrufe ja nur an die richtigen new/delete malloc/free weitergeleitet werden muessen.

    Mich würde aber auch mal ein Tool interessieren, das hier genauere Angaben liefert und nativ auf win32 läuft. VC zeigt zwar die leaks beim beenden an ( mit dem richtigen SysCall), aber auch nicht immer.
    rya.


  • Mod



  • 😉


  • Mod

    Jochen Kalmbach schrieb:

    😉

    Da gibt's nix zu grinsen, wenn man gute Seiten empfiehlt... 🤡



  • knivil schrieb:

    Naja, Cygwin und Co, wenns kein Port gibt. Gibt es anscheined nicht, Pech gehabt.

    ne, glück gehabt. mit solch vorsinntflutlichem zeug sollen sich mal schön die unix-fans herumquälen.
    🙂



  • Martin Richter schrieb:

    http://www.codeproject.com/KB/applications/leakfinder.aspx

    Unterstützt kein MSVC2008 leider... und ich konnte auch keine Report erzeugen trotz offensichtlicher Leaks, die zum Test erzeugt wurden.
    rya.



  • Nimm die aktuelle Version von hier:
    http://blog.kalmbachnet.de/files/LeakFinder-RC8.zip



  • Jochen Kalmbach schrieb:

    Nimm die aktuelle Version von hier:
    http://blog.kalmbachnet.de/files/LeakFinder-RC8.zip

    Danke dir, Jochen.
    Ich hab ohne Anleitung ein wenig suchen müssen, hab jetzt aber folgenden code zur Verwendung:

    #ifdef NL_PLATFORM_WIN32
    int WINAPI WinMain( HINSTANCE hInstance,
                        HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine,
                        int nShowCmd )
    #else
    int main(int argc, char** arg)
    #endif
    {
        LeakFinderXmlOutput leak;   
        CApplication app;
        app.go(); // hier läuft das ganze programm.
        leak.ShowCallstack();
        return TRUE;
    }
    

    Ich bekomme jede Menge output und der wird auch in einer Datei gespeichert.
    Beim lesen der Datei stürzt das Programm aber ab:

    Informationen über das Aufrufen von JIT-Debuggen
    anstelle dieses Dialogfelds finden Sie am Ende dieser Meldung.

    ************** Ausnahmetext **************
    System.Xml.XmlException: Das 'MEMREPORT'-Anfangstag in Zeile '1' stimmt nicht mit dem Endtag von 'LEAK' überein. Zeile 7, Position 5.
    bei System.Xml.XmlTextReaderImpl.Throw(Exception e)
    bei System.Xml.XmlTextReaderImpl.Throw(String res, String[] args)
    bei System.Xml.XmlTextReaderImpl.ThrowTagMismatch(NodeData startTag)
    bei System.Xml.XmlTextReaderImpl.ParseEndElement()
    bei System.Xml.XmlTextReaderImpl.ParseElementContent()
    bei System.Xml.XmlTextReaderImpl.Read()
    bei System.Xml.XmlTextReader.Read()
    bei MemLeakAnalyse.LeakFile.ReadXMLFile(String xmlFile)
    bei MemLeakAnalyse.Form1.button1_Click(Object sender, EventArgs e)
    bei MemLeakAnalyse.Form1.btnXMLFileSelect_Click(Object sender, EventArgs e)
    bei System.Windows.Forms.Control.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
    bei System.Windows.Forms.Button.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

    ************** Geladene Assemblys **************
    mscorlib
    Assembly-Version: 2.0.0.0.
    Win32-Version: 2.0.50727.3082 (QFE.050727-3000).
    CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll.
    ----------------------------------------
    MemLeakAnalyse
    Assembly-Version: 1.0.3138.18245.
    Win32-Version: 1.0.3138.18245.
    CodeBase: file:///C:/Dokumente%20und%20Einstellungen/****/Desktop/LeakFinder-RC8/MemLeakAnalyse/bin/Release/MemLeakAnalyse.exe.
    ----------------------------------------
    System.Windows.Forms
    Assembly-Version: 2.0.0.0.
    Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll.
    ----------------------------------------
    System
    Assembly-Version: 2.0.0.0.
    Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll.
    ----------------------------------------
    System.Drawing
    Assembly-Version: 2.0.0.0.
    Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll.
    ----------------------------------------
    System.Xml
    Assembly-Version: 2.0.0.0.
    Win32-Version: 2.0.50727.3082 (QFE.050727-3000).
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll.
    ----------------------------------------
    System.XML.resources
    Assembly-Version: 2.0.0.0.
    Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml.resources/2.0.0.0_de_b77a5c561934e089/System.Xml.resources.dll.
    ----------------------------------------
    System.Windows.Forms.resources
    Assembly-Version: 2.0.0.0.
    Win32-Version: 2.0.50727.3053 (netfxsp.050727-3000).
    CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms.resources/2.0.0.0_de_b77a5c561934e089/System.Windows.Forms.resources.dll.
    ----------------------------------------
    mscorlib.resources
    Assembly-Version: 2.0.0.0.
    Win32-Version: 2.0.50727.3082 (QFE.050727-3000).
    CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll.
    ----------------------------------------

    ************** JIT-Debuggen **************
    Um das JIT-Debuggen (Just-In-Time) zu aktivieren, muss in der
    Konfigurationsdatei der Anwendung oder des Computers
    (machine.config) der jitDebugging-Wert im Abschnitt system.windows.forms festgelegt werden.
    Die Anwendung muss mit aktiviertem Debuggen kompiliert werden.

    Zum Beispiel:

    <configuration>
    <system.windows.forms jitDebugging="true" />
    </configuration>

    Wenn das JIT-Debuggen aktiviert ist, werden alle nicht behandelten
    Ausnahmen an den JIT-Debugger gesendet, der auf dem
    Computer registriert ist, und nicht in diesem Dialogfeld behandelt.

    Ich hoffe, ich habe es richtig verwendet :).
    rya.


Log in to reply