Speicherlecks finden?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Speicherlecks finden?

Beitrag von Konne »

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)
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

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...
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!
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

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
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Danke für die Tipps. Ich machs grad so, dass ich immer codeteile ausdokumentiere und dann seh ich (hoffendlich) wo es auftritt.
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

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.

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
Wenn mal einer schauen könnte ob bei ihm das gleiche Ergebnis herauskommt würde mich das sehr freuen.
armada
Beiträge: 100
Registriert: 10.10.2005 18:00
Kontaktdaten:

Beitrag von armada »

hmm keine ahnung warum des mit der dll nicht geht...als prozedur bleibt bei mir der benötigte ram für das proggi konstant

also kannste es vielleicht mal ohne dll versuchen...dann sollte es ja normal bei dir auch gehen

mfg
armada

p.s.: also ich hab v3.94
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

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!
Benutzeravatar
Konne
Beiträge: 764
Registriert: 30.03.2005 02:20
Kontaktdaten:

Beitrag von Konne »

Ich dachte immer die Speicherverwaltung würde von Windows übernommen werden. Wie ist das dann bei Strings oder Variablen die ich zurückgeben werden die auch nicht gefreet?
Benutzeravatar
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

Beitrag von NicTheQuick »

Du kannst doch gar keine Strings von einer DLL-Funktion zurückgeben
lassen. Du kannst höchstens einer Funktion einen Buffer übergeben, den
sie dann füllt.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Was meinst du, wieso du Rückgabestrings immer als Global definieren musst?
Antworten