amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > wie findet man speicherlecks? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

27.11.2009, 14:20 Uhr

AGSzabo
Posts: 1663
Nutzer
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

[ - Antworten - Zitieren - Direktlink - ]

27.11.2009, 14:52 Uhr

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

[ - Antworten - Zitieren - Direktlink - ]

27.11.2009, 14:59 Uhr

thomas
Posts: 7718
Nutzer

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/

[ - Antworten - Zitieren - Direktlink - ]

27.11.2009, 16:10 Uhr

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

--
Pegasos MorphOS

[ - Antworten - Zitieren - Direktlink - ]

27.11.2009, 16:15 Uhr

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

[ - Antworten - Zitieren - Direktlink - ]

27.11.2009, 16:23 Uhr

Der_Wanderer
Posts: 1229
Nutzer
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


[ - Antworten - Zitieren - Direktlink - ]

27.11.2009, 16:42 Uhr

thomas
Posts: 7718
Nutzer

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/

[ - Antworten - Zitieren - Direktlink - ]

27.11.2009, 16:57 Uhr

MaikG
Posts: 5172
Nutzer
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.

[ - Antworten - Zitieren - Direktlink - ]

29.11.2009, 22:02 Uhr

Holger
Posts: 8116
Nutzer
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...

[ - Antworten - Zitieren - Direktlink - ]

30.11.2009, 11:45 Uhr

MaikG
Posts: 5172
Nutzer
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.

[ - Antworten - Zitieren - Direktlink - ]

30.11.2009, 13:27 Uhr

Thore
Posts: 2266
Nutzer
@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.


[ - Antworten - Zitieren - Direktlink - ]

30.11.2009, 17:42 Uhr

Holger
Posts: 8116
Nutzer
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.

[ - Antworten - Zitieren - Direktlink - ]

30.11.2009, 18:52 Uhr

Thore
Posts: 2266
Nutzer
@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.

[ - Antworten - Zitieren - Direktlink - ]

01.12.2009, 11:16 Uhr

MaikG
Posts: 5172
Nutzer
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.

[ - Antworten - Zitieren - Direktlink - ]

01.12.2009, 11:35 Uhr

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

Dann benutz doch AllocPooled() und co.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > wie findet man speicherlecks? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.