Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Fehler in Delphi-Memory-Manager? (https://www.delphipraxis.net/32901-fehler-delphi-memory-manager.html)

Motzi 29. Okt 2004 12:26


Fehler in Delphi-Memory-Manager?
 
Hallo,

ich hab ein Programm, das zur Laufzeit dynamisch Speicher per GetMemory reserviert. In diesen Speicher werden dann Daten aus einer Datei eingelesen, verarbeitet und der Speicher wird danach wieder korrekt per FreeMemory freigegeben.

Erste Tests funktionierten wunderbar, im Dauerbetrieb (das Prog ist eine Art Server der per FTP immer wieder Daten reinbekommt die es weiterverarbeiten muss) trat jedoch immer wieder (ohne erkennbares Muster) eine EAccessViolation auf. Das Prog schreibt alle möglichen Aktionen in ein Log-File mit und damit auch solche Exceptions mitgeloggt werden verwend ich madExcept. Ich hab mir nun die von madExcept erstellten Bug-Reports angeschaut und festgestellt, dass die EAccessViolations alle innerhalb des FreeMemory-Aufrufes auftreten und zwar meistens an Zeile 1089 in getmem.inc, aber in manchen Fällen auch an anderen Stellen (ebenfalls in getmem.inc). Ich habe nun mal testweise statt GetMemory/FreeMemory auf VirtualAlloc/VirtualFree umgestellt und jetzt funktioniert alles problemlos. Aber ich versteh nicht warum es mit GetMemory/FreeMemory nicht funktioniert hat...

Ich sollte vielleicht noch erwähnen, dass das Prog mit Threads arbeitet, dh. die Speicherreservierung, Datenverarbeitung und Freigabe erfolgt immer in einem eigenen Thread, allerdings wird der Speicher immer nur innerhalb eines Threads verwendet, ein Synchronisations-Problem (von meiner Seite her) kann es also auch nicht sein.

Hat jemand schonmal ähnliche Erfahrungen gemacht?

Gruß, Motzi

Motzi 7. Nov 2004 12:55

Re: Fehler in Delphi-Memory-Manager?
 
Hat wirklich noch nie jemand ein ähnlich merkwürdiges Verhalten beobachten können..? :?

jbg 7. Nov 2004 13:00

Re: Fehler in Delphi-Memory-Manager?
 
Zitat:

Zitat von Motzi
Hat jemand schonmal ähnliche Erfahrungen gemacht?

Ja und zwar mit freigeben von bereits freigegebenen bzw. gar nicht reserviertem Speichern.

Der Delphi-Speichermanager führt einen Lesezugriff auf den reservieren Speicher aus, und bei einem nicht reservierten Block löst das natürlich einen Schutzverletzung aus.

VirtualFree hingegen löst keine aus, liefert aber einen ErrorCode zurück.

Ich würde den Fehler suchen gehen, denn wer weiß, was da noch passieren kann.

Motzi 7. Nov 2004 13:09

Re: Fehler in Delphi-Memory-Manager?
 
Der Speicher ist garantiert noch nicht freigegeben (außer der Speichermanager baut schon vorher mist). Das ganze findet in einer einzigen Prozedur statt, der Speicher wird sonst nirgendwo verwendet sondern ganz normal am Ende der Prozedur freigegeben.
Ich werd mal mitloggen ob VirtualFree einen ErrorCode zurückliefert, aber ich kann es mir nicht vorstellen..!

Muetze1 7. Nov 2004 22:19

Re: Fehler in Delphi-Memory-Manager?
 
Moin!

Der Speichermanager von Delphi ist nicht richtig Thread-Safe und daher kann es zu Problemen führen. Ich würde dir mal testweise empfehlen einen anderen Speichermanager zu probieren. Einen Thread-Safe Speichermanager findest du z.B. hier.

MfG
Muetze1


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz