Forum: PC-Programmierung Speicherreservierung überwachen


von Marcel (Gast)


Lesenswert?

Hi,
das Projekt an dem Ich arbeite ist mittlerweile so weit 
vorrangeschritten, das ich nichtmehr sicher sagen kann, ob der Speicher 
der reserviert wird auch immer sicher wieder freigegeben wird. Wollte 
daher den new-Operator überladen, sowie delete-Operator überladen, um 
dadurch jedes mal was in ein Logfile zu schreiben. Blöderweise lässt 
sich der new-Operator nur für einzelne Typen überladen, nicht aber für 
alles und jedes. Hatte eigentlich gehofft, das mit einem Template lösen 
zu können, VC++ sagt darauf hin aber nur, das new keine Funktion ist, 
was ja auch stimmt.

Kennt da wer eine Möglichkeit wie ich relativ einfach zu meiner 
Überwachungsfunktion komme oder doch noch new überladen kann?

von Markus E. (engelmarkus)


Lesenswert?

http://www.andreasen.org/LeakTracer/
Schau dir das mal an, das sollte man relativ leicht anpassen können. Es 
wird einfach eine Objekt-Datei mitgelinkt, und am Ende dann ein Log 
geschrieben. Das könntest du ja stattdessen über den UART oder so 
ausgeben lassen.
Das ganze THREAD_SAVE-Zeug kannst du rauswerfen, und das fprintf musst 
du natürlich noch ersetzen. Im Moment ist die Objekt-Datei 33 kb groß, 
aber das sollte in den Griff zu kriegen sein.
Eigentlich nicht schlecht, was er in 500 Zeilen Code untergebracht hat 
:) .

von Markus E. (engelmarkus)


Lesenswert?

Hier mal eine kleine Ausgabe:
1
# starting Sun Aug 29 01:23:02 2010
2
# memory overrun protection of 4 Bytes
3
# initializing new memory with 0xAA
4
# sweeping deleted memory with 0xEE
5
# aborts on OVERWRITE_MEMORY 
6
# internal buffer now 256
7
S   0x400d0c   0x400d27  # new[] but delete normal ; size 4
8
O   0x400d0c   0x400d27  # memory overwritten beyond allocated 4 bytes
9
# 4 byte beyond area:
10
# 78 bb cc dd 
11
# abort; DUMP of current state
12
LeakTracer aborting program
13
# LeakReport
14
# from new @ |      size  # Pointer Addr
15
L   0x400cfe          40  # 0x22390b0
16
# total allocation requests:      2 ; max. mem used 0 kBytes
17
# leak     40 Bytes  :-(
18
Aborted

Er arbeitet so, dass er die Operatoren new, delete, new[] und delete[] 
global überschreibt und auf seine eigenen Funktionen umbiegt. Dort führt 
er Buch über die Aufrufe und benutzt intern malloc und free zum 
Reservieren.

von Christoph L. (clauer)


Lesenswert?

Kennst Du Smart-Pointer ? Die Boost Bibliothek hat die z.B. dabei...

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.