Forum: Mikrocontroller und Digitale Elektronik Memory Leaks


von ingeniör (Gast)


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

von Karl heinz B. (kbucheg)


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).

von A.K. (Gast)


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.

von Hans (Gast)


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.

von Karl heinz B. (kbucheg)


Lesenswert?

@Hans

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

von ingeniör (Gast)


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

von Hans (Gast)


Lesenswert?

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

von Klaus (Gast)


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.

von Karl heinz B. (kbucheg)


Lesenswert?

> er schrieb, dass er seine Strukturen mit free() wieder freigibt.

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

von sepp (Gast)


Lesenswert?

@ ingeniör:

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

von sepp (Gast)


Lesenswert?

@ ingeniör:

Manche Debugger müssten das können.

von Hans (Gast)


Lesenswert?

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

In manchen Systemen schon.

von ingeniör (Gast)


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

von Unbekannter (Gast)


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.

von Karl H. (kbuchegg)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.