Memory Leak bei BlitzMax DLLs ?
Übersicht

![]() |
LunatixBetreff: Memory Leak bei BlitzMax DLLs ? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi.
Ich habe mit BlitzMax eine "Plugin" DLL erstellt, das Hauptprogramm Lädt diese Plugins mit "LoadLibrary" und per "GetProcAddress" werden die Funktionen zugewiesen. Zur Laufzeit des Hauptprogrammes wird nun die Hauptfunktion der DLL aufgerufen. Das Problem ist: sobald dies Geschiet, steigt im Taskmanager der Speicherverbrauch gewaltig an. Beim Start des Programmes stand in etwa "5.620K" dort, nach dreissig Sekunden schon "5.976K". Die funktion ist leer, gibt aber einen Integer Wert zurück ob neue "Events" vorliegen, die dann Abgerufen werden müssen. Sobald ich dies Auskommentiere, gehts Problemlos. Spielt dort eventuell der GC nichtmehr mit, oder woran kann das liegen? |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
GCSuspend und GCResume hast du verwendet?
BM hat aktuell keinen offiziellen DLL support und das leider aus gutem Grunde, denn das ist noch das harmloseste Problem in das du potentiell reinrennen könntest. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Casiopaya |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi
Das ist doch nur ein Anstieg von 6%, welcher nichts ungewöhnliches ist. Wann immer ein Programm ausgeführt wird (z.B. deine Funktion) bernimmt das Betriebssystem das Speichermanagement. Das tut es immer so, dass unter der optimalen Nutzung der vorhandenen Ressourcen die optimale Effizienz erreicht wird. Ist es also "geschickter" weiteren Speicher für deine Funktion zu allokieren, so wird das gemacht. "Wozu" darfst du hier nicht fragen, dazu müsstest du schon Sceduling und Assembler sprechen. Lade mal deinen RAM voll, soll heißen allokieren z.B. in einem Programm immer größere Speicherfelder. Dann wird der Verbrauch deiner Dll wieder nach unten gehen, weil das OS wirtschaftet. Der GC schafft unter Blitz eigentlich vorbildlich, kein Vergleich zu diesem lahmen Hanswurst in Java ![]() Grüße |
||
![]() |
Lunatix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das schlimmste ist, das es, sobald man W/CStrings erstellt und diese übergibt, das Programm ohne eine Meldung einfach Abstürzt. Auch, wenn ich in der DLL und in meinem Programm, nachdem die Daten ausgetauscht sind, MemFree aufrufe.
Nun, Casiopaya, was du sagst mag zwar stimmen, jedoch geht das ja immer soweiter ![]() Aber GCSupsend/Resume verwendete ich nicht, nein. Werds mal testen... Edit: GCSupsend/Resume bringt auch nichts, Programm stürzt weiterhin einfach ab... |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
![]() |
Casiopaya |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ok dann kann ich dir leider nicht weiterhelfen sorry, da brauchts vermutlich nen Experten für DllImport. Aber wie Dreamora schon sagte: Da BM noch keinen DLL-Support hat stehst du vermutlich vor so vielen unvorhersehbaren Problemen, dass sich ein Weiterarbeiten nur fraglich lohnt. | ||
Dreamora |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Was machst du denn genau?
Was du auf keinen Fall darfst ist in BM IRGENDWAS freigeben was du von einem hostprogramm bekommen hast. Das ist aufgabe des Hostprogrammes. Auf der BM Seite gibst du normalerweise garnix frei weil das Aufgabe des GCs ist. Wer da meint er müsse mit Byte Ptr rumholzen soll C nehmen und die DLL darin schreiben, das ist sicherer und auch die korrekte Lösung. Die Byte Ptr in BM sind nur um mit C / C++ / ASM zusammen zu arbeiten beim Import. Innerhalb von BM kann man sich damit massive Löcher reinschiessen die zu ganz genialen Fehlern führen die unmöglich zu finden sein werden solange man nicht schon lange mit BM arbeitet und nen gespür dafür hat woher die fehler kommen könnten potentiell (oder mit Blide und Step debugging verdummt ^^) Und nur um das auch klarzustellen: Du darfst auch keine objekte in BM erzeugen und die Pointer zu diesen rausgeben. Denn die Pointer sind nicht stabil, die können potentiell vom GC geändert werden oder der Speicher einfach dealloziert ohne dass das host programm davon unterrichtet wird (weils net innerhalb des einflussbereichs des GC ist). In dem Falle macht das Host Programm einfach bumm. |
||
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen. |
![]() |
Lunatix |
![]() Antworten mit Zitat ![]() |
---|---|---|
Okay, dann weiss ich was ich falsch machte. Von der DLL wurde ein WString mittels Short Ptr an das Hauptprogramm gesendet, das Hauptprogramm sendete das ebenfalls. Dann werde ich wohl normale Strings benutzen müssen. Bzw. es ganz sein lassen müssen, denn bisher habe ich auch Strukturen(Klassen/Types) in ein Byte Ptr umgewandelt und dieses zum Host/ vom Host zur Lib. gesendet...
Code: [AUSKLAPPEN] Type TPluginEvent Method New() uid=HandleFromObject(Self) End Method Field id:Int Field uid:Int Field data:Byte Ptr End Type Type TUnknownStruct Function getInt:Int(struct:Byte Ptr,pos:Int) Return (struct[pos+3]*$1000000)+(struct[pos+2]*$10000)+(struct[pos+1]*$100)+struct[pos] End Function Function getBytePtr:Byte Ptr(struct:Byte Ptr,pos:Int) Return Byte Ptr(getInt(struct,pos)) End Function Function getShortPtr:Short Ptr(struct:Byte Ptr,pos:Int) Return Short Ptr(getInt(struct,pos)) End Function End Type Type TUserList_Item Extends TUnknownStruct Field lpItem :Int Field lpParent :Int Field lpName :Short Ptr Field rename :Int Field staticText :Short Ptr Function makestruct:TUserList_Item(data:Byte Ptr) Local item:TUserList_Item = New TUserList_Item item.lpItem = getInt(data,0) item.lpParent = getInt(data,4) item.lpName = getShortPtr(data,8) item.rename = getInt(data,12) item.staticText = getShortPtr(data,16) Return item End Function Method free() MemFree lpName MemFree staticText End Method End Type Event.data wurde mittels "Event.data = Byte Ptr(Struct)" belegt, "Event.id", "Event.uid" wurden per "Int Var" übergeben, "Event.data" per "Byte Ptr Var". Aus den Byte Ptr des "Event.data" lässt sich dann die Struktur mit ".makestruct" wieder herstellen. Naja, es war einen Versuch wert... Edit: Ich habe es nun mit "Object Var" gemacht, was bisher auch funktioniert, und die WStrings lasse ich raus. Da ich aber anscheinend nur Objekte vom Host im Host Casten kann, habe ich dieses Object einfach der "makestruct" Methode Übergeben, die das Object kurzzeitig als "Byte Ptr" behandelt und dann die Informationen in eine Klasse über- und zurückgibt. Die Frage nun: Kann das nun auch zu Problemen führen? Oder gibts eventuell eine Elegantere Methode? |
||
[size=9]Pro|gram|mier|er: Ein Organismus, der Koffein in Software umwandelt.
Geben Sie eine beliebige 11-stellige Primzahl ein, um fortzusetzen... |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group