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:Das funktioniert aber nur mit sehr einfach strukturierten Programmen... [ - Antworten - Zitieren - Direktlink - ] |
30.11.2009, 11:45 Uhr MaikG Posts: 5172 Nutzer |
Zitat: Ich versuche das ebend alles einfach zu halten. 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: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: 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: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. |