![]() |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Zitat:
Schau mal in die FastMM4Options.inc, da gibts nen paar Optionen. Bei Speicherlecks sollte eine Logdatei automatisch erstellt werden, wenn du das Programm im Debugger startest. Wenn das Log auch außerhalb von Delphi erstellt werden soll, gibts da glaube ich die Option RequireDebuggerPresentForLeakReport oder so. |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Naja ich hatte es gedownloadet und entpackt und zu der Form sowie zum Projekt (an erster Stelle) "FastMM4" hinzugefügt. Aber weiter kam ich dann halt nicht.
MfG xZise |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo ihr,
ich habe es nun hingekriegt die Fehlermeldung auszugeben. Das Ergebnis ist im Anhang. Eine Sache: Ich habe den Code etwas verändert. In UHaupt:
Delphi-Quellcode:
In UZeilen:
procedure TFLiberate.FormCreate(Sender: TObject);
begin Datenbank := TDatenbank.Create(ExtractFilePath(ParamStr(0)) + 'db'); ReportMemoryLeaksOnShutdown := true; Exemplarliste := TExemplareZeilenListe.Create; Kursliste := TKursZeilenListe.Create; Exemplarliste.LadeAusDatenbank(Datenbank); end;
Delphi-Quellcode:
Wenn ich den letzten Datenbank Aufruf auch noch entfernen würde, würde kein Fehler mehr kommen.
procedure TExemplareZeilenListe.LadeAusDatenbank(const ADatenbank : TDatenbank);
var Daten : TExemplarZeile; i : Integer; ILExemplarIDs, ILPersonenIDs, ILBuchIDs, ILBEIDs : TIntegerList; BLAusgedruckt : TBooleanList; begin inherited; ILExemplarIDs := TIntegerList.Create; ILPersonenIDs := TIntegerList.Create; ILBuchIDs := TIntegerList.Create; ILBEIDs := TIntegerList.Create; BLAusgedruckt := TBooleanList.Create; try ADatenbank.GibExemplarIDs(ILExemplarIDs); finally ILExemplarIDs.Free; ILPersonenIDs.Free; ILBuchIDs.Free; ILBEIDs.Free; BLAusgedruckt.Free; end; end; MfG xZise |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Die Leaks sind zwar unschön, aber schlecht sind vor allem die ersten beiden Fehler. Diese verursachen auch die Fehler. Diese zeigen, dass da Speicher tatsächlich überschrieben wird.
Jetzt müsste der Stacktrace mit den Adressen verglichen werden, dafür gibts auch die Möglichkeit eine Map Datei zu erzeugen. Ob FastMM da noch mehr Details kann, weiß ich nicht. |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Hallo Sebastian,
ich vermute es liegt am ehesten an den "Move"-Befehlen. Ich werde mal gucken, in wie fern ich da was rausbekomme. Okay, ich habe alle "Move"-Befehle manuell implementiert (in TMainList!) und es funktioniert. Wobei nur das "Move" in "MoveContent" aufgerufen wird:
Delphi-Quellcode:
So funktioniert es. Wenn ich aber die Kommentarezeichen entferne, bekomme ich Fehler.
procedure TMainList.MoveContent(const AFrom, ATo, ASize: Integer);
var i, ValueCount: Integer; ValueBuffer : TVarRecArray; begin // Problemstelle ! //Move(FValues[AFrom], FValues[ATo], ASize); //exit; ValueCount := ASize div SizeOf(TVarRec); SetLength(ValueBuffer, ValueCount); for i := 0 to ValueCount - 1 do ValueBuffer[i] := FValues[AFrom + i]; for i := 0 to ValueCount - 1 do FValues[ATo + i] := ValueBuffer[i]; end; Ich verwende "Move" auch im Add(TVarRecArray) sowie im Assign. Aber wie gesagt, das wird nicht aufgerufen in dieser Konstellation. Ich glaube ich werde das in eine extra "TXList"-Stressunit umbauen. Aber ist den hier nicht "Move" möglich? MfG xZise |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Doch, eigentlich geht das so. Prüf am besten vorher und nachher den Inhalt einmal im Debugger.
|
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Eigentlich ist der Inhalt immer in Ordnung.
MfG xZise |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo ich bins wieder,
ich habe jetzt hier eine "Stresstest"-Version. Bei mir kann ich nur IntegerList verwenden ohne Fehlermeldungen. MfG xZise |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Move sollte man in Verbindung mit Variablen deren Inhalt eine Referenzzählung erfordert nicht einsetzen.
Das betrifft insbesondere Daten die Strings oder Interface enthalten. |
Re: Freigeben -> AV; Bearbeiten -> Nichts weiter
Also alternativ jeden einzelnen Wert kopieren? Oder gibt es eine "bessere" Alternative?
MfG xZise |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz