Speicherlecks finden?
Speicherlecks finden?
Hallo erstmal zusammen. ICh hzabe ein Programm geschrieben, wenn ich es jetzt laufen lasse und mir den Speicherverbrauch ansehen, bemerke ich dass er kontinuiertlich steigt. Bin ich da jetzt dran schuld oder ist das unter Windows halt so? WEenn ich dran schuld bin, wie finde ich so einen Fehler dann am schnellsten. (ca 6000 Zeilen Code)
- Tafkadasom2k5
- Beiträge: 1578
- Registriert: 13.08.2005 14:31
- Kontaktdaten:
Schreib in die Prozedur, die was in den Speicher läd, eine Debug-Message rein, woran du siehst, wie oft er das macht.Damit kannste unter Umständen ungewollten rekursiven Aufrufen auf die Schliche kommen..
Nur sone stumpfe Idee...
Nur sone stumpfe Idee...
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Normalerweise bist du dann dran schuld
Such nach AllocateMemory() und verfolge ab da den Programmablauf,
du musst sicher sein, dass du auch FreeMemory() benutzt! Oft ist auch
ein ReAllocateMemory() nützlicher als ein AllocateMemory()!
Ich würde mir ein einheitliches System überlegen, damit z. B. wenn du
einen Pointer an eine Prozedur übergibst, dass KEINE Prozedur den
Speicher, der ihr übergeben wurde, frei gibt. Es muss also durch den
Aufrufer geschehen. Machs einfach einheitlich. Ich machs immer so, wie
ichs oben beschrieben hab.
greetz
Remi

Such nach AllocateMemory() und verfolge ab da den Programmablauf,
du musst sicher sein, dass du auch FreeMemory() benutzt! Oft ist auch
ein ReAllocateMemory() nützlicher als ein AllocateMemory()!
Ich würde mir ein einheitliches System überlegen, damit z. B. wenn du
einen Pointer an eine Prozedur übergibst, dass KEINE Prozedur den
Speicher, der ihr übergeben wurde, frei gibt. Es muss also durch den
Aufrufer geschehen. Machs einfach einheitlich. Ich machs immer so, wie
ichs oben beschrieben hab.
greetz
Remi
Warum zur Hölle geht das bei mir nicht???
Also folgender Code stürtz bei mir ohne Debugger ab und mit Debuger steigt der Speicherverbrauch kontinuierlich. Aber warum nur?
Das hier sind mal die 2. Codes. Das untere ist die Dll das obere das Programm.
Wenn mal einer schauen könnte ob bei ihm das gleiche Ergebnis herauskommt würde mich das sehr freuen.
Also folgender Code stürtz bei mir ohne Debugger ab und mit Debuger steigt der Speicherverbrauch kontinuierlich. Aber warum nur?
Das hier sind mal die 2. Codes. Das untere ist die Dll das obere das Programm.
Code: Alles auswählen
If OpenLibrary(1,"dll.dll")
Buf=IsFunction(1,"Free")
For t = 1 To 10000
*Point=CallFunctionFast(Buf)
FreeMemory(*Point)
Delay(1)
Debug "!"
Next
EndIf
Beep(100,100)
Code: Alles auswählen
ProcedureDLL Free()
*Buf=AllocateMemory(4)
ProcedureReturn *Buf
EndProcedure
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz
Die DLL ist wie eine eigene Exe (z. T. zumindest), somit sind die Memory-
Funktionen, die du in der DLL benutzt nicht die 'gleichen' wie die im Programm. Du musst also jedes Memory, dass du in der DLL erstellst,
auch in der DLL wieder löschen! (oder eine Funktion in der DLL, die du
dann aufrufen kannst um den Speicher zu löschen) Umgekehrt auch für
das Hauptprogramm.
FreeMemory() schlägt hier fehl!
Funktionen, die du in der DLL benutzt nicht die 'gleichen' wie die im Programm. Du musst also jedes Memory, dass du in der DLL erstellst,
auch in der DLL wieder löschen! (oder eine Funktion in der DLL, die du
dann aufrufen kannst um den Speicher zu löschen) Umgekehrt auch für
das Hauptprogramm.
FreeMemory() schlägt hier fehl!
- NicTheQuick
- Ein Admin
- Beiträge: 8809
- 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
- remi_meier
- Beiträge: 1078
- Registriert: 29.08.2004 20:11
- Wohnort: Schweiz