Speicherlecks finden (evtl. hilfreich)

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Speicherlecks finden (evtl. hilfreich)

Beitrag von NicTheQuick »

Hab mir hier eine Kleinigkeit gebastelt um Speicherlecks zu finden. Da die
OnError-Lib ja leider unter Linux nicht funktioniert, ist es etwas einfacher
geworden.

Code: Alles auswählen

Global MemAlloc.l
Procedure AMcount(Size.l)
  Protected *mem
  If Size <= 0 : ProcedureReturn 0 : EndIf
  *mem = AllocateMemory(size + 4)
  If *mem
    PokeL(*mem, size)
    MemAlloc + Size
    ProcedureReturn *mem + 4
  EndIf
  ProcedureReturn 0
EndProcedure
Procedure RAMcount(*mem, Size.l)
  Protected oldSize.l, *nmem
  If Size <= 0 : ProcedureReturn 0 : EndIf
  oldSize = PeekL(*mem - 4)
  *nmem = ReAllocateMemory(*mem - 4, Size + 4)
  If *nmem
    MemAlloc - oldSize + Size
    PokeL(*nmem, Size)
    ProcedureReturn *nmem + 4
  EndIf
  ProcedureReturn 0
EndProcedure
Procedure FMcount(*mem)
  MemAlloc - PeekL(*mem - 4)
  ProcedureReturn FreeMemory(*mem - 4)
EndProcedure
Procedure AMnocount(Size.l)
  ProcedureReturn AllocateMemory(size)
EndProcedure
Procedure RAMnocount(*mem, Size.l)
  ProcedureReturn ReAllocateMemory(*mem, Size)
EndProcedure
Procedure FMnocount(*mem)
  ProcedureReturn FreeMemory(*mem)
EndProcedure

Macro AllocateMemory(Size, mode=count)
  AM#mode(Size)
EndMacro
Macro ReAllocateMemory(mem, Size, mode=count)
  RAM#mode(mem, Size)
EndMacro
Macro FreeMemory(mem, mode=count)
  FM#mode(mem)
EndMacro
Es wird eine globale Variable 'MemAlloc.l' definiert, die die Anzahl der
allokierten Bytes beinhaltet. Die Funktionen 'AllocateMemory()',
'ReAllocateMemory()' und 'FreeMemory()' werden durch Procedures
ersetzt und erhalten einen zusätzlichen optionalen Parameter. Dieser kann
entweder weggelassen werden um die Bytes zu zählen oder es kann mit
ihm 'nocount' übergeben werden, wodurch die Bytes nicht gezählt werden.
Wichtig ist, dass ein mit 'AllocateMemory(?)' allokierter Speicher weiterhin
nur mit den Funktionen ohne optionalen Parameter verwendet werden
darf. Umgekehrt gilt das selbe.

Ein Beispiel dazu gibt es nicht. Die Anwendung sollte klar sein.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

hab auch mal sowas gepostet, allerdings ohne 'nocount' möglichkeit: http://www.purebasic.fr/german/viewtopi ... highlight=
könnte man auch noch erweitern, so dass nur erfolgreiche allocs die variable inkrementieren und der rückgabewert von allocatememory() weitergereicht wird.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Tatsächlich. Hab den Thread damals sogar schon gelesen.

Bei mir funktioniert das alles, was bei dir eben noch fehlt. Und da ich
festgestellt habe, dass 'MemorySize()' nicht immer zuverlässig funktioniert,
habe ich es eben in die ersten 4 Bytes gepackt. Als ich eben meine Hashtable
debuggt hatte, habe ich alles gebraucht, was da oben im ersten Post steht.
Antworten