Speicherzugriffsfehler (Speicherabzug geschrieben)

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von MacWomble »

Seit heute abend habe ich mit meinem Projekt ein Problem, welches allerdings nur im Release auftritt, nicht in der Debugversion.
Nach einigen Aktionen im Programm beendet sich dieses mit dem Fehler Speicherzugriffsfehler (Speicherabzug geschrieben)

Es wurde auch nichts im Projekt verändert

Ich habe die Release- und die Debugversion nochmals erstellt und es bleibt bei diesem Verhalten.

PS unter Linux Mint getestet
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von Warf »

benutzt du Threads?

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von MacWomble »

Nein, ich benutze keine Threads. Es ist eine DB-Anwendung mit MySQL. Was mich wundert ist, dass dies jetzt plötzlich auftritt und nur wenn ich es im Release-Mode kompiliere. Ich habe also keine Chance im Debugmode den Fehler zu finden.

Ich habe eben mit einem älteren Release getestet und es passiert auch dort.

Ich habe keine Idee, wo ich anfangen könnte zu suchen.

Im Debug-Mode erhalte ich diesen unauffälligen Heap dump:
1017289 memory blocks allocated : 245008408/247935048
1017289 memory blocks freed : 245008408/247935048
0 unfreed memory blocks : 0
True heap size : 4096000
True free heap : 4096000

Im Release beendet sich das Programm undefiniert selbst (immer beim Schließen von Forms oder möglicherweise bei Datenbank-Updates) mit dem Speicherzugriffsfehler.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von af0815 »

Arbeitest du mit dem Heaptrace ? Wenn ja, bindest du den selbst ein, oder über den Compilerschalter (bzw. Einstellungen von Lazarus) ?

Tritt das Problem auch auf, wenn du es im Debugmodus OHNE gdb laufen lässt ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von MacWomble »

Habe jetzt auch im Debug-Mode eine Ausgabe:

Code: Alles auswählen

qt5ct: using qt5ct plugin
qt5ct: D-Bus global menu: no
qt5ct: using qt5ct plugin
qt5ct: D-Bus global menu: no
Heap dump by heaptrc unit of /home/klaus/Entwicklung/CTR-BOSS/ctrboss
1893624 memory blocks allocated : 387558108/393307496
1893622 memory blocks freed     : 387558044/393307432
2 unfreed memory blocks : 64
True heap size : 4161536
True free heap : 4161152
Should be : 4161216
Call trace for block $00007FFFE8007540 size 24
  $000000000047FE66  SEITEDOKUMENTESHOW,  line 173 of FRAMES/fra_auftrag.pas
  $00000000005F2883  DOSHOW,  line 201 of include/custompage.inc
  $00000000005F2638  CMVISIBLECHANGED,  line 154 of include/custompage.inc
  $0000000000431E4A
  $00000000005819D9  WNDPROC,  line 5425 of include/wincontrol.inc
  $000000000058D196  PERFORM,  line 1581 of include/control.inc
  $00000000005943DD  SETVISIBLE,  line 4538 of include/control.inc
  $00000000005F560C  SHOWCURRENTPAGE,  line 1144 of include/customnotebook.inc
Call trace for block $00007FFFE95C2840 size 40
  $000000000047FE66  SEITEDOKUMENTESHOW,  line 173 of FRAMES/fra_auftrag.pas
  $00000000005F2883  DOSHOW,  line 201 of include/custompage.inc
  $00000000005F2638  CMVISIBLECHANGED,  line 154 of include/custompage.inc
  $0000000000431E4A
  $00000000005819D9  WNDPROC,  line 5425 of include/wincontrol.inc
  $000000000058D196  PERFORM,  line 1581 of include/control.inc
  $00000000005943DD  SETVISIBLE,  line 4538 of include/control.inc
  $00000000005F560C  SHOWCURRENTPAGE,  line 1144 of include/customnotebook.inc


Was mich irritiert ist qt5ct. Hat das mit qt5 zu tun? Ich kompiliere mit GTK...
Wie komme ich mit dieser Ausgabe weiter?

Heaptrc ist über den Kompilerschalter

Code: Alles auswählen

162 procedure TfraAuftrag.SeiteDokumenteHide(Sender: TObject);
163 begin
164   RecList.Free;
165 end;
166
167 procedure TfraAuftrag.SeiteDokumenteShow(Sender: TObject);
168 begin
169   ChangeColumnWidths(dbgDokumentenListe, True);
170   dbgDokumentenListe.Visible := False;
171   lblCNTDokument.Caption := SetFilterDokumentAuftrag('', 3);
172   dbgDokumentenListe.Visible := True;
173   RecList := TBookmarkList.Create(dbgDokumentenListe);
174 end;


OK, scheint mit der RecList zusammen zu hängen ...
Zuletzt geändert von MacWomble am Fr 21. Sep 2018, 10:28, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von af0815 »

Nein, für den Grund des Beendens ist das nicht so hilfreich. Es ist nur ersichtlich, das nach dem Beenden 2 Blöcke noch nicht freigegeben worden sind, aber kein Hinweis WARUM das Programm beendet worden ist.

Edit: Kannst du ev. mit dem Hide und Show (visible true/false) eine zirkulare Referenz auslösen ? Ich verwende meist BeginUpdate und EndUpdate um den visuellen Komponenten zu sagen, das sie sich jetzt mal nicht refreshen sollen, solange Daten geändert werden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von MacWomble »

Habe oben noch etwas geändert (Zeilennummern)

Ich habe auf der Frame ein DBGrid. Im DBGrid können über die erste Spalte Datensätze markiert (angekreuzt) werden. Hierfür ist RecList im Einsatz - und die scheint sich irgendwie zu verhaspeln.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von af0815 »

die RecList vor dem Free auf nil prüfen und nach dem Free auf nil setzen. Sichert das ganze ab
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von MacWomble »

Ich habe jetzt

Code: Alles auswählen

 
  if not (RecList=NIL)  then
  begin
    RecList.Free;
    RecList:=NIL;
  end;


Das Problem besteht weiter :(

Und so ganz verstehen ich das auch nicht (zumindest nach der Delphi-Info):

Die Methode Free überprüft zuerst, ob das TBookmarkList-Objekt nicht bereits nil ist, und ruft Destroy nur bei Bedarf auf.
Destroy gibt den Speicher frei, in dem das Eigenschafts-Array Items gespeichert wurde.

D.h. ja, nach dem Free existiert RecList doch gar nicht mehr und kann theoretisch auch nicht auf NIL gesetzt werden.
Oder wird Destroy nicht bei free aufgerufen (was heißt 'bei Bedarf')

In der Meldung wird aber auf die Zeile mit dem Create verwiesen ...

Nachtrag:
Hiermit scheint es im Debug-Mode zu gehen, im Release-Mode kommt nach wie vor Speicherzugriffsfehler :cry:

Code: Alles auswählen

if RecList= NIL then RecList := TBookmarkList.Create(dbgDokumentenListe);
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von Warf »

Es gibt grundlegend zwei Gründe die mir einfallen warum das so sein könnte das du den Fehler nur im Release bekommst

1. parallele Race conditions (daher meine Frage nach Threads) denn der debug Code läuft extrem viel langsamer als Release Code (Faktor 100-1000 langsamer) und es könnte sein das irgendwas parallel abläuft was zu schnell im Release läuft
2. Optimierungsfehler. Die Höhe Optimierung von Release könnte eine speicheruugriff falsch optimiert haben. Probier doch einfach mal aus die optimierungsstufen runter zu setzen

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von af0815 »

MacWomble hat geschrieben:In der Meldung wird aber auf die Zeile mit dem Create verwiesen ...

Weil in der obigen Meldung ja keine Information zu einem Absturz enthalten ist. Heaptrace zeigt ja nur wo Speicherlöcher sind. Trifft aber keine Aussage zur Beendigung des Programmes.

Was steht im Terminal/Konsole wenn du das Programm von ebendort aus startest - nur die obigen Zeilen (von Heaptrace) oder noch mehr Infos ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von MacWomble »

Zu 1.: keine Threads
Zu 2.: Habe ich bereits versucht

Generell bin ich etwas irritiert, da bis vorgestern das Problem nicht auftrat - zumindest ist es nicht aufgefallen. Aber seither beendet sich das Programm nach wenigen Aktionen. Komischerweise passiert dies auch mit der älteren Version vom 14.09.2018 und auch mit der Version vom 10.06.2018. Beide Versionen liefen bisher problemlos.
Das Problem ist auch nicht nur auf meinem Rechner, das habe ich auch bereits getestet.
Die Systeme sind mit Linux Mint 19 und 18.3 auch etwas unterschiedlich. Könnte es dennoch mit einem BS-Update zusammen hängen?

In der Konsole kommt bei der Release nur der Speicherzugriffsfehler.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6200
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von af0815 »

MacWomble hat geschrieben:In der Konsole kommt bei der Release nur der Speicherzugriffsfehler.


Speicherzugriffsfehlker würde zB. ein SIGSEGV oder " Segmentation fault (core dumped) " sein. In den vorherigen Post ist nur ein Heaptrace der beim Beenden des Programmes erstellt wird. Auch wenn das Programm 'normal' Beendet wird. Das ist kein Anzeichen für einen Programmabsturz.

MIr geht bei deinem Heaptrace nur eine Zeile ab ('128 bytes used in startup',) - das passiert normalerweise nur wenn Heaptrace per uses eingebunden wird und nicht über die Projekteinstellungen.
http://wiki.lazarus.freepascal.org/heaptrc
http://forum.lazarus.freepascal.org/ind ... #msg240096
https://freepascal.org/docs-html/curren ... index.html
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

MacWomble
Lazarusforum e. V.
Beiträge: 999
Registriert: Do 17. Apr 2008, 01:59
OS, Lazarus, FPC: Mint 21.1 Cinnamon / FPC 3.2.2/Lazarus 2.2.4
CPU-Target: Intel i7-10750 64Bit
Wohnort: Freiburg

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von MacWomble »

Nein, ist nicht in den uses verwendet. Ich habe sicherheitshalber alle Dateien durchsuchen lassen.

Im Terminal steht nach dem ungewollten Abbruch nur: Speicherzugriffsfehler (Speicherabzug geschrieben)
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.

Warf
Beiträge: 1908
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitrag von Warf »

Hast du eventuell eine falsche MySQL Version?

So ein Speicherzugriffsfehler kann vorkommen wenn du versuchst eine Variable (oder funktion) aus einer (dynamisch geladenen) Lib zu verwenden, bei der nach einem Update die Variable umbenannt wurde (oder gelöscht). Du musst schauen das die MySQL lib version mit dem Wrapper (also die MySQL Unit) kompatibel ist. Eventuell wird nur im release bestimmter Code des Wrappers ausgeführt.

Ist zwar sehr unwahrscheinlich, könnte aber erklären warum das problem plötzlich auftrat.

Antworten