Memory leaks eines fremden Programmes beseitigen - Chancen?



  • Danke erstmal.
    Kannst du das genauer begründen?



  • Du müsstest die entsprechenden Funktionen im Disassembler finden, komplett reversen, gefixt neu schreiben und die alte Funktion zu der neuen hooken.



  • Flicker2 schrieb:

    Es gibt da so eine Serveranwendung (Eine .exe, paar .dlls), welche leider leaked, also der RAM-Verbrauch steigt ständig an.
    Anfänglich mit vielleicht 300 MB, sind es nach 12 Stunden sicher schon knapp 1000 MB.

    Ich habe die Serverrechner immer so eingestellt, daß die Serveranwendung zu einer festen Uhrzeit des nachts neu startet, einmal sogar mit reboot des Rechners. Bei deinem Riesenloch müßtest Du das vielleicht sogar zweimal am Tag machen.



  • Wenn ich wüsste, wie ich die leaks finde, könnte ich schon mal weitersehen... Die Hoffnung..ach ihr wisst ja.

    @volkard
    Jo aber genau das möchte ich verhindern.



  • nachdem du hier im forum danach gefragt hast, kann man daon ausgehen, dass du es nicht innerhalb eines jahres schaffen kannst



  • Flicker2 schrieb:

    @volkard
    Jo aber genau das möchte ich verhindern.

    Jo aber genau so wirst du es im Endeffekt machen.



  • Ok, dann nicht.



  • Flicker2 schrieb:

    Ok, dann nicht.

    Ich hab dir einen Lösungsvorschlag geboten.



  • Wenn die ursprünglichen Entwickler es nicht geschafft haben die MemoryLeaks, trotz Quellcode und guten Debugmöglichkeiten zu beheben, dann wird es für jemand der noch nicht mal, weiß wo er anfangen soll, wohl recht schwierig.

    Aber so was wie Valgrind könnte dir helfen. Das funktioniert iirc auch mit Programmen, zu denen du nicht den Quellcode hast (wenn auch nicht so gut).



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Themen rund um den PC in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Die Stelle zu finde wo das Leak ehtsteht sollte nicht SO schwer sein.
    Die Stelle zu finden wo man es freigeben sollte zu finden, wird aber vermutlich äusserst schwierig bis nahezu unmöglich werden.
    Wenn der Fehler nicht total trivial ist.



  • hustbaer schrieb:

    Die Stelle zu finde wo das Leak ehtsteht sollte nicht SO schwer sein.

    naja, das problem duerfte doch eher sein etwas als leak zu identifizieren. kann z.b. sein dass irgend ein container intern immer weiter waechst, aber deswegen ist noch lange nicht der ganze container invalid und ihn komplett zu loeschen ist dann sicher _nie_ eine gute idee (z.b. ein vector der nur waechst).
    besonders wenn sowas in c#/java geschrieben sein sollte findet man nur schwer etwas.

    volkards idee ist die gaengiste loesung bei sowas. 👍



  • rapso schrieb:

    hustbaer schrieb:

    Die Stelle zu finde wo das Leak ehtsteht sollte nicht SO schwer sein.

    naja, das problem duerfte doch eher sein etwas als leak zu identifizieren. kann z.b. sein dass irgend ein container intern immer weiter waechst, aber deswegen ist noch lange nicht der ganze container invalid und ihn komplett zu loeschen ist dann sicher _nie_ eine gute idee (z.b. ein vector der nur waechst).
    besonders wenn sowas in c#/java geschrieben sein sollte findet man nur schwer etwas.

    Das ist schon richtig, ja. Ich wollte damit nicht sagen dass es immer einfach ist das Leak zu finden. Eher dass es oft einfach sein ist, es aber noch lange nicht reicht zu wissen wo etwas leakt, damit man es so einfach fixen kann. Vor allem ohne Source.

    An C#/Java hab' ich dabei nicht gedacht - da ist es natürlich doppelt schwierig ein Leak zu finden, da es "klassische" Leaks ja garnicht gibt (ausgenommen PInvoke/JNI Sachen). Und im "Leak Fall" meist irgendwelche ewig wachsenden Collections oder selbst gebastelte wuchernde Graphen existieren.

    volkards idee ist die gaengiste loesung bei sowas. 👍

    Ja, ich hatte ja bereits geschrieben dass das die Lösung ist, bei der er höchstwahrscheinlich landen wird.



  • Irgendwie Speicher finden, der nur kurzzeitig benutzt wird, und dann ewig belegt bleibt?



  • Flicker2 schrieb:

    Irgendwie Speicher finden, der nur kurzzeitig benutzt wird, und dann ewig belegt bleibt?

    Satz mit allen Bausteinen zusammensetzen dennoch nutzlos sei?



  • ;flicky schrieb:

    Satz mit allen Bausteinen zusammensetzen dennoch nutzlos sei?

    Self-owned?



  • Flicker2 schrieb:

    ;flicky schrieb:

    Satz mit allen Bausteinen zusammensetzen dennoch nutzlos sei?

    Self-owned?

    Ja. Du.



  • Ich hab' kürzlich sogar mit Source einer Fremdlib aufgesteckt. Zwei Miss-by-ones gefunden, ein free auf 'nen Pointer ins Nirvana, passendes Leak dazu, das Ding crashte immer noch und der Tag war futsch.
    Ich hab's dann neu geschrieben. Ohne Source wär' ich nach 'ner Stunde drauf gekommen, von der Lib die Finger zu lassen.
    Will damit sagen, rebooten ist der einzige Weg, mit Disasm, reengineering usw. haust Du nur Zeit tot. 👎



  • pointercrash() schrieb:

    Will damit sagen, rebooten ist der einzige Weg

    Prozess re-starten sollte reichen 🙂



  • Irgendwie Speicher finden, der nur kurzzeitig benutzt wird, und dann ewig belegt bleibt?

    Was ist daran nicht Deutsch? 🙄

    "Ich möchte irgendwie Speicher finden, der nur kurzzeitig benutzt wird, und dann ewig belegt bleibt."

    So besser? Oder hocke ich schon zu lange zu Hause?

    Ok, dann lasse ich es. Es wurde ja nur Valgrind genannt, und das ist nicht für Win32...


Anmelden zum Antworten