mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Memory Leaks


Autor: ingeniör (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich programmiere einen MC in C. Das Programm enthält viele dynamisch 
erzeugte Strukturen, die ich auch alle wieder mit free() freigebe. Nun 
würde ich trotzdem gerne wissen ob im Speicher irgendwelche memory leaks 
entstanden sind. Gibt es eine Möglichkeit das harauszufinden? Sprich 
eine C-Funktion oder Ähnliches die solche leaks erkennt.

Vielen Dank schon mal.

Gruss

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nein, gibt es nicht. Zumindest nicht in Standard-C.

Allerdings kann man sich sowas selber bauen:
Jeder malloc wird über eine Zwischenfunktion geführt,
die mitprotokolliert, welcher Speicherbereich mit
wievielen Bytes belegt wurde. Die Umkehrung dann
in einem selbst geschriebenen free(). Aus dem Protokoll
wird die Freigabe wieder herausgestrichen. Am Ende
darf nichts mehr im Protokoll enthalten sein.

Ist ne nette Übung. Nicht weiter schwer.
Das Hauptproblem ist die Speicherverwaltung für das
Protokoll. Wenn du ungefähr weist, wieviele Allokierung
im Maximum gleichzeitig zu erwarten sind, kannst du das
ganz einfach als statisches Array dimensionieren. Für
den allgemeienen Fall müsste man das Protokoll selbst
wieder dynamisch verwalten (Array in Blöcken anlegen).

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zuverlässige Embedded Systems und dynamische Speicherverwaltung passen 
nicht sonderlich gut zusammen.

Kannst mal nach debug_malloc googlen.

Gängige Technik ist, im Debug-Fall dem allozierten Speicher den Inhalt 
von _FILE__ und __LINE_ mitzugeben. Wenn das allerdings, wie oft, 
bloss eine eigene aufgesetzte Allokatorfunktion ist, bringt das nichts. 
Ausserdem braucht das reichlich mehr Platz.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man kann der Software nicht immer trauen. Besser du schickst den MC nach 
Programmende in einen Halt-Zustand, der sämtliche RAM-Leitungen in einen 
Tristate versetzt. Nun kannst du mit einer einfachen Schaltung (CPLD 
oder einfacher Zähler) sicherstellen, dass alle RAM-Zellen auf 0x0000 
zurückgesetzt sind. Es bleibt die Möglichkeit, dass noch 
Speicherbereiche alloziert sind, die aber auf 0 gesetzt sind. Das macht 
jedoch nichts, da die Nullen auch bei Mehrfachallozierung nicht schaden.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hans

Wer oder was sollte deiner Meinung nach die RAM-Zellen
auf 0 setzen?

Autor: ingeniör (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also erst mal danke für die antworten.

@hans
an der HW kann ich leider nichts rumbasteln, das sollte schon möglichst 
in der software passieren

@kh
die idee mit den eigenen malloc funktion ist net schlecht. werdmich mal 
daran versuchen

gruss

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger
er schrieb, dass er seine Strukturen mit free() wieder freigibt.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das Programm enthält viele dynamisch erzeugte Strukturen ...

Genau das ist der Fehler.

So'n Teufelszeug braucht man nicht bei "embedded" Programmierung auif 
uP.
Das ist was für PC's mit Gigabyte Speicher und MMU und sonstnochwas.

Man verwendet nur statische Arrays oder "auto" Variablen (Stack).
Keinen "Heap".

Wenn die 1 kByte Ram nicht reichen, kauft man eben einen etwas größeren 
uP mit 4 oder 16 KByte.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> er schrieb, dass er seine Strukturen mit free() wieder freigibt.

Und?
free() setzt den Speicher, den es freigibt nicht auf 0.

Autor: sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ingeniör:

Was für einen uC verwendest du?
Wie gross ist der RAM?
Welche IDE(Compiler)?
Was für eine Anwendung?

Autor: sepp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ ingeniör:

Manche Debugger müssten das können.

Autor: Hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und?
> free() setzt den Speicher, den es freigibt nicht auf 0.

In manchen Systemen schon.

Autor: ingeniör (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@sepp

ich verwende den XC161 von infineon mit 2k ram. als compiler keil 
uVision3.

die anwendung braucht strukturen da eine verkettete liste realisiert 
wird.


gruss

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
malloc() und free() beissen sich nicht mit eine uC. Es gibt genügend 
zuverlässige Algorithmen dafür. Dazu wurde die letzten 20 Jahre genügend 
geforscht, auch speziel für kleine Heaps.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hans wrote:
>> Und?
>> free() setzt den Speicher, den es freigibt nicht auf 0.
>
> In manchen Systemen schon.

Das ist dann ein Grund diese Systeme zu meiden :-)

Im Ernst: Ausser bei speziellen Debug-Builds wirst du
kaum ein System finden, dass bei einem free() den Speicher
ausnullt. Sowas würde auch komplett der C Philosophie
widersprechen. Getan wird nur das Allernotwendigste was
für den Job notwendig ist. malloc() nullt den Speicher
nicht aus. Wenn ich das will, muss ich calloc() benutzen.
Den Speicher auszunullen macht für free() überhaupt
keinen Sinn, daher macht das auch Keiner. Ganz im Gegenteil:
Wenn ich 200 MB allokiere und free() müht sich, unter
heftigem Pagen, durch den Speicher um den auf 0 zu setzen,
dann würde der Compilerhersteller mächtig Ärger kriegen.
Wenn ich das will, muss ich vor dem free() explizit
einen memset() benutzen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.