Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Garbage Collection ohne neu zu compilieren

1 view
Skip to first unread message

Roman Racine

unread,
Feb 7, 2012, 5:34:05 PM2/7/12
to
Ich habe hier Binaries einer Closed Source Software. Diese hat ein Memory
Leak, das unter gewissen Anwendungsmustern, die in letzter Zeit gehÀuft
vorkommen, extrem störend ist, d.h. stÀndige Neustarts notwendig macht.

Ich habe mir gedacht, dass dieses Problem behoben werden könnte, wenn
Aufrufe fĂŒr malloc() u.Ă€. von der glibc in eine Library umgebogen wĂŒrde, die
Garbage Collection macht. Dadurch hÀtte man diese FunktionalitÀt, ohne dass
die Software neu compiliert werden mĂŒsste (was im Moment nicht möglich ist,
da der Source Code nicht verfĂŒgbar ist).

Ein Àhnliches Vorgehen hat valgrind zur detektierung von Memory Leaks,
technisch möglich mĂŒsste es also sein, allerdings habe ich nichts
dergleichen gefunden. Der Boehm Garbage Collector erfordert anscheinend,
dass die Software neu compiliert wird.

Hat jemand hier VorschlÀge?

Gruss

Roman°
Message has been deleted

Sven Hartge

unread,
Feb 7, 2012, 8:37:35 PM2/7/12
to
Heiko Schlenker <hsc...@gmx.de> wrote:
> * Roman Racine <roman....@gmx.de> schrieb:

>> Hat jemand hier VorschlÀge?

> LD_PRELOAD

Ich glaube, das kenne Roman. Er sucht nur etwas, _das_ er preloaden
kann, welches das malloc(), was ihm Probleme macht, ersetzt bzw.
ergÀnzt.

S°

--
Sigmentation fault. Core dumped.

Stefan Enzinger

unread,
Feb 7, 2012, 11:20:51 PM2/7/12
to
On 02/07/2012 11:34 PM, Roman Racine wrote:
> Ein Àhnliches Vorgehen hat valgrind zur detektierung von Memory Leaks,
> technisch möglich mĂŒsste es also sein, allerdings habe ich nichts
> dergleichen gefunden. Der Boehm Garbage Collector erfordert anscheinend,
> dass die Software neu compiliert wird.

Valgrind bedingt allerdinge erhebliche performance einbußen, um diese
Felherl zu erkennen. Ich denke also, dass so ein garbage collector, so
es ihn gibt, das kaum performant erledigen kann...

just my 2 cent

Marcel MĂŒller

unread,
Feb 8, 2012, 3:26:38 AM2/8/12
to
Hallo,

On 07.02.2012 23:34, Roman Racine wrote:
> Ich habe hier Binaries einer Closed Source Software. Diese hat ein Memory
> Leak, das unter gewissen Anwendungsmustern, die in letzter Zeit gehÀuft
> vorkommen, extrem störend ist, d.h. stÀndige Neustarts notwendig macht.
>
> Ich habe mir gedacht, dass dieses Problem behoben werden könnte, wenn
> Aufrufe fĂŒr malloc() u.Ă€. von der glibc in eine Library umgebogen wĂŒrde, die
> Garbage Collection macht. Dadurch hÀtte man diese FunktionalitÀt, ohne dass
> die Software neu compiliert werden mĂŒsste (was im Moment nicht möglich ist,
> da der Source Code nicht verfĂŒgbar ist).

das kannst Du guten Gewissens vergessen.

Zwar ist es technisch möglich, die malloc/calloc/realloc/free-Aufrufe
umzuleiten falls, und nur falls die Anwendung durchgÀngig eine
DLL-Version der C-Runtime verwendet. Die Vorgehensweise ist im Prinzip
per DLL-Rename alle Referenzen der Anwendung auf die Runtime-DLL auf
eine eigene DLL umzubiegen. Das kann man binÀr im Executable patchen.
Die eigene DLL leitet dann alle Runtime-Aufrufe auf die Original-DLL um
und ersetzt nur einige Aufrufe. Wenn man es richtig macht, hÀlt sich der
Overhead bis hier hin in Grenzen, denn bis auf die ersetzten Aufrufe
kann man die Umleitung statisch vom Executable-Loader durchfĂŒhren
lassen, so dass zur Laufzeit wie bisher die Original-Runtime
angesprungen wird. Aber ...


> Ein Àhnliches Vorgehen hat valgrind zur detektierung von Memory Leaks,
> technisch möglich mĂŒsste es also sein, allerdings habe ich nichts
> dergleichen gefunden. Der Boehm Garbage Collector erfordert anscheinend,
> dass die Software neu compiliert wird.

... der Knackpunkt ist, dass die ersetzten Runtime-Funktionen keine
Möglichkeit haben, herauszufinden, welche Speicherblöcke tatsÀchlich
noch benötigt werden. Dazu mĂŒsste man das Programm komplett auseinander
nehmen. Das ist letztlich auch der Ansatz von valgrind, allerdings
funktioniert er nicht fehlerfrei. Und außerdem ist das Programm damit
nicht mehr produktiv nutzbar.

Programmfehler bleiben Programmfehler. Wenn die Anwendung leckt, hat man
eigentlich nur wenige Möglichkeiten.
- Man kann solange mehr Speicher einbauen, bis es nicht mehr so sehr stört.
- Man kann die Anwendung regelmĂ€ĂŸig (automatisch) neu starten.
- Wenn die Leckage-Blöcke grĂ¶ĂŸer als die System-Page-Size (typ. 4k)
sind, kann man einfach großen Swap-Space bereitstellen, und dem
Betriebssystem den Rest ĂŒberlassen. Das fĂŒhrt allerdings zu einer
Fragmentierung der Memory-Descriptoren und mithin zu mehr oder minder
deutlichen Performance-Verlusten.


Marcel

Edzard Egberts

unread,
Feb 8, 2012, 3:41:12 AM2/8/12
to
Roman Racine schrieb:
> Ich habe hier Binaries einer Closed Source Software. Diese hat ein Memory
> Leak, das unter gewissen Anwendungsmustern, die in letzter Zeit gehÀuft
> vorkommen, extrem störend ist, d.h. stÀndige Neustarts notwendig macht.
>
> Ich habe mir gedacht, dass dieses Problem behoben werden könnte

*HĂŒstel* - also wenn die Software von mir ist, habe ich das vorgestern
behoben! :o)

Ansonsten solltest Du Dich wirklich an den Hersteller der Software wenden...

Florian Weimer

unread,
Feb 8, 2012, 4:43:58 AM2/8/12
to
* Roman Racine:

> Der Boehm Garbage Collector erfordert anscheinend, dass die Software
> neu compiliert wird.

Es gab zumindest frĂŒher einen Modus, der malloc umschrieb.

Jan Kandziora

unread,
Feb 8, 2012, 6:18:01 AM2/8/12
to
Roman Racine wrote:
>
> Ein Àhnliches Vorgehen hat valgrind zur detektierung von Memory Leaks,
>
Valgrind beobachtet den Stackpointer sowie parallel malloc()/free() sowie
einige andere Aufrufe. Durch diese Beobachtung kann es kurzlebige von
langlebigen Objekten unterscheiden.

HÀufig wird behauptet, Valgrind fÀnde "Memory Leaks". Das ist so nicht
richtig, vielmehr wirft Valgrind alle Objekte raus, die bewiesen kurzlebig
sind und daher kein Speicherleck darstellen.

Welche der langlebigen Objekte Speicherlecks sind und welche gĂŒltige Daten
enthalten muss ein verstÀndiger Mensch entscheiden.

Mit freundlichem Gruß

Jan
Message has been deleted

Roman Racine

unread,
Feb 8, 2012, 1:00:16 PM2/8/12
to
Danke fĂŒr den Hinweis. Unter "Simple Example" auf Hans Boehms Webseite steht
tatsĂ€chlich etwas darĂŒber, dort habe ich bisher nicht gesucht.

Mein Lösungsversuch sieht nun wie folgt aus:

- http://www.hpl.hp.com/personal/Hans_Boehm/gc/gc_source/gc-7.1.tar.gz
heruntergeladen und entpackt
- configure --prefix=~/gc --enable-redirect-malloc
- make
- make install
- export LD_PRELOAD=~/gc/lib/libgc.so
- Programm ausfĂŒhren

Problem: Das Programm verwendet Threads und da fÀllt dieser Lösungsweg aufs
Maul, auch mit der aktuellsten Entwicklungsversion. FĂŒr single-threaded
Software wĂŒrde das aber funktionieren.

Gruss

Roman°

Marc Haber

unread,
Feb 11, 2012, 9:30:54 AM2/11/12
to
Heiko Schlenker <hsc...@gmx.de> wrote:
>* Sven Hartge <sh-...@svenhartge.de> schrieb:
>> Heiko Schlenker <hsc...@gmx.de> wrote:
>>> * Roman Racine <roman....@gmx.de> schrieb:
>>>> Hat jemand hier VorschlÀge?
>>
>>> LD_PRELOAD
>>
>> Ich glaube, das kenne Roman. Er sucht nur etwas, _das_ er preloaden
>> kann, welches das malloc(), was ihm Probleme macht, ersetzt bzw.
>> ergÀnzt.
>
>Ach so. Dann wÀre wohl die Newsgroup de.comp.os.unix.programming
>thematisch besser geeignet.

Warum? Vielleicht sucht er ja nach einer fertigen Library.

GrĂŒĂŸe
Marc
--
-------------------------------------- !! No courtesy copies, please !! -----
Marc Haber | " Questions are the | Mailadresse im Header
Mannheim, Germany | Beginning of Wisdom " | http://www.zugschlus.de/
Nordisch by Nature | Lt. Worf, TNG "Rightful Heir" | Fon: *49 621 72739834
0 new messages