amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > wie findet man speicherlecks? [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2009-11-27, 14:20 h

AGSzabo
Posts: 1663
User
hi,

was kann ich machen um rauszufinden wo beim programmende der speicher nicht freigegeben wird? der "memory snooper" funktioniert bei mir nicht.

ferner könnte ich selber ein programms schreiben das, das irgendwie auf den speicher aufpasst, aber wie.

gruß
Andreas
--
Sam mini os4.1 -- e-uae 39bb2 -- A4000D 3.0 - 2mbchip/8mbfast - Ariadne_II - ide DVD und HD -- A500 3.1 (mkick) adide 50mb -- Duron 1200mhz Ubuntu Linux

[ - Answer - Quote - Direct link - ]

2009-11-27, 14:52 h

ZeroG
Posts: 1487
User
@AGSzabo:
Sollange es nur OS3.x ist, einfach mit avail.

[ - Answer - Quote - Direct link - ]

2009-11-27, 14:59 h

thomas
Posts: 7718
User

Bei komplexen Programmen mache ich das meistens so, daß ich statt AllocVec in der exec.library meine eigene Funktion aufrufe und dieser als zusätzlichen Parameter noch einen Kommentar mitgebe. Die eigene Funktion ruft dann AllocVec auf und trägt die Adresse samt Kommentar in eine Liste ein. Bei FreeVec entsprechend eine Funktion, die den Eintrag aus der Liste entfernt.

Am Programmende rufe ich dann eine Funktion "free_all", die die Liste durchgeht, alle verbliebenen Einträge freigibt und die Kommentare ins Debug-Log schreibt. So ist sichergestellt, daß trotz fehlendem FreeVec der Speicher freigegeben wird und mit Hilfe der Kommentare finde ich heraus, wo ich das Free vergessen habe.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2009-11-27, 16:10 h

Wishmaster
Posts: 140
User
Das ist eine gute Methode.
Danke für den Tip.

--
Pegasos MorphOS

[ - Answer - Quote - Direct link - ]

2009-11-27, 16:15 h

Thore
Posts: 2266
User
Ist dann sowas wie ein Garbage Collector =) Feine Sache

[ - Answer - Quote - Direct link - ]

2009-11-27, 16:23 h

Der_Wanderer
Posts: 1229
User
Das funzt aber nur für eigene Allocs. Und die hat man meistens im Griff.
Viele kleine Allocs würde ich sowieso in einen Pool tun, ist schneller und wird am Ende schön aufgeräumt vom OS.

Problematisch sind eher Dinge vom OS, die man nicht aufräumt, wo man nicht dran denkt. Z.b. irgendein RastPort wo noch ein LayerInfo dranhängt etc.


--
HD-Rec, Sweeper, Samplemanager, ArTKanoid, Monkeyscript, Toadies, AsteroidsTR, TuiTED, PosTED, TKPlayer, AudioConverter, ScreenCam, PerlinFX, MapEdit, AB3 Includes und viele mehr...
Homepage: http://www.hd-rec.de


[ - Answer - Quote - Direct link - ]

2009-11-27, 16:42 h

thomas
Posts: 7718
User

Man kann das Verfahren natürlich so erweitern, daß man alle Resourcen, die man allokiert, mit einem Typkennzeichen in die Liste einträgt und die free_all-Funktion dann die dem Typ entsprechende Free-Funktion aufruft.

Kleinere Speicherlecks, wo bei jedem Programmaufruf die gleiche Anzahl Bytes fehlt, kann man auch identifizieren, indem man Anhand der Größe die Struktur sucht, die allokiert wurde.

Gruß Thomas

--
Email: thomas-rapp@web.de
Home: thomas-rapp.homepage.t-online.de/

[ - Answer - Quote - Direct link - ]

2009-11-27, 16:57 h

MaikG
Posts: 5172
User
http://aminet.net/search?query=memory+leak

Hatte mal noch ein anderes Programm das sowas anzeigt. Weiss aber nicht mehr wie es hiess. Ich schreibe den FreeVec meist gleich nach AllocVec und das Programm dann erst dazwischen.

[ - Answer - Quote - Direct link - ]

2009-11-29, 22:02 h

Holger
Posts: 8116
User
Zitat:
Original von MaikG:
Ich schreibe den FreeVec meist gleich nach AllocVec und das Programm dann erst dazwischen.

Das funktioniert aber nur mit sehr einfach strukturierten Programmen...

[ - Answer - Quote - Direct link - ]

2009-11-30, 11:45 h

MaikG
Posts: 5172
User
Zitat:
Original von Holger:
Das funktioniert aber nur mit sehr einfach strukturierten Programmen...



Ich versuche das ebend alles einfach zu halten. :D
Vermeide bzl. Speicherfragmentation neues Allocieren und Freigeben.
Kann zwar sein das ein Puffer grade nicht benutzt wird und Freigeben werden könnte, aber bei den heutigen Speichergrößen sehe ich kein Problem.

[ - Answer - Quote - Direct link - ]

2009-11-30, 13:27 h

Thore
Posts: 2266
User
@MaikG:
> aber bei den heutigen Speichergrößen sehe ich kein Problem

Naja das ist der Punkt warum nur noch ineffizient programmiert wird. "Heutzutage hat man viel Speicher, heutzutage sind Prozessoren schnell genug..."
Und was sieht man? Es wird immer lahmer wegen dieser Philosophie.

Man kann sich an Grundregeln halten:
Lokale Variablen:
Erstellen - Arbeiten - Freigeben

Globale Variablen:
An Einsprung-Punkt erstellen und am Exit-Punkt freigeben (eigene Exit-Funktion verwenden)

Tips:
Beim Freigeben auch auf NULL setzen, und vor dem Freigeben prüfen ob es NULL ist (Vermeidung doppelter Freigaben)
Auf Referenzen (Pointer-zugewiesene Variablen) achtgeben

Zum Debug: Speicher vor dem Start ausgeben, Speicher nach dem Beenden ausgeben und vergleichen.


[ - Answer - Quote - Direct link - ]

2009-11-30, 17:42 h

Holger
Posts: 8116
User
Zitat:
Original von Thore:
Man kann sich an Grundregeln halten:
Lokale Variablen:
Erstellen - Arbeiten - Freigeben

Globale Variablen:
An Einsprung-Punkt erstellen und am Exit-Punkt freigeben (eigene Exit-Funktion verwenden)

Nun ja, das sind die Trivialfälle, die mit Maiks Strategie, den Programmcode immer zwischen Belegen und Freigeben einzufügen, funktionieren können.

Schwierig wird es dann, wenn ein Programm, das länger als eine Minute läuft, auch verschiedene Ressourcen abhängig von Ereignissen benötigt. Nehmen wir einfach mal einen Texteditor, bei dem man immer wieder neue Texte öffnen kann. Wenn der vergisst, die gelockten Dateien wieder freizugeben, und deshalb jede Datei gelockt hält, die jemals geöffnet wurde, kann man das nicht so einfach tolerieren.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Answer - Quote - Direct link - ]

2009-11-30, 18:52 h

Thore
Posts: 2266
User
@Holger:
Ja sicher gibt es Sonderfälle, gerade in so Cache-Fragen, aber auch hier sind die Speicherblöcke (Adressen, Größen) festgehalten und können gefreed werden. Hier ist auch dringend auf eine strukturierte Programmierung zu achten weil man sonst den Faden verliert.

[ - Answer - Quote - Direct link - ]

2009-12-01, 11:16 h

MaikG
Posts: 5172
User
Zitat:
Original von Thore:

Naja das ist der Punkt warum nur noch ineffizient programmiert wird. "Heutzutage hat man viel Speicher, heutzutage sind Prozessoren schnell genug..."
Und was sieht man? Es wird immer lahmer wegen dieser Philosophie.



Das ist schon richtig. Aber wenn das Programm von sich aus mind. OS3.0
vorraussetzt, programmiere ich nicht für den A500.
Also muss ich nicht davon ausgehen das nur 512kB Ram da sind.
Falls einer Rom 3.x einbaut, dann sicher auch mehr Ram.
Es geht mir nicht um Puffer die mehrere MB groß sind, sondern
von kleineren.

Manche Puffer werden in vielen Funktions/Sub auch wiederbenutzt.

Am Amiga hat man normalerweise kein Viruellen Speicher.

Und AllocVec/FreeVec ist langsamer als den Speicherbereich nur
zu löschen.

[ - Answer - Quote - Direct link - ]

2009-12-01, 11:35 h

ZeroG
Posts: 1487
User
@MaikG:
Zitat:
Und AllocVec/FreeVec ist langsamer als den Speicherbereich nur
zu löschen.

Dann benutz doch AllocPooled() und co.

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > wie findet man speicherlecks? [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.