Speicherzugriffsfehler (Speicherabzug geschrieben)

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.

Speicherzugriffsfehler (Speicherabzug geschrieben)

Beitragvon MacWomble » 20. Sep 2018, 21:00 Speicherzugriffsfehler (Speicherabzug geschrieben)

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.
MacWomble
 
Beiträge: 610
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon Warf » 21. Sep 2018, 00:02 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

benutzt du Threads?
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon MacWomble » 21. Sep 2018, 07:49 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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.
MacWomble
 
Beiträge: 610
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon af0815 » 21. Sep 2018, 08:58 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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).
af0815
 
Beiträge: 3501
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon MacWomble » 21. Sep 2018, 09:00 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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 21. Sep 2018, 09:28, insgesamt 1-mal geändert.
Alle sagten, dass es unmöglich sei - bis einer kam und es einfach gemacht hat.
MacWomble
 
Beiträge: 610
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon af0815 » 21. Sep 2018, 09:13 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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).
af0815
 
Beiträge: 3501
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon MacWomble » 21. Sep 2018, 09:32 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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.
MacWomble
 
Beiträge: 610
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon af0815 » 21. Sep 2018, 09:45 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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).
af0815
 
Beiträge: 3501
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon MacWomble » 21. Sep 2018, 10:09 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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.
MacWomble
 
Beiträge: 610
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon Warf » 21. Sep 2018, 11:37 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

Beitragvon af0815 » 21. Sep 2018, 11:49 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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).
af0815
 
Beiträge: 3501
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon MacWomble » 21. Sep 2018, 11:58 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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.
MacWomble
 
Beiträge: 610
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon af0815 » 21. Sep 2018, 12:15 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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).
af0815
 
Beiträge: 3501
Registriert: 7. Jan 2007, 10:20
Wohnort: Niederösterreich
OS, Lazarus, FPC: FPC 3.2 Lazarus 2.0 per fpcupdeluxe | 
CPU-Target: 32Bit (64Bit)
Nach oben

Beitragvon MacWomble » 21. Sep 2018, 12:25 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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.
MacWomble
 
Beiträge: 610
Registriert: 17. Apr 2008, 00:59
Wohnort: Freiburg
OS, Lazarus, FPC: Mint 19 Cinnamon / CodeTyphon Generation V Plan 6.60 | 
CPU-Target: Intel i7 64/32 Bit
Nach oben

Beitragvon Warf » 21. Sep 2018, 13:22 Re: Speicherzugriffsfehler (Speicherabzug geschrieben)

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.
Warf
 
Beiträge: 985
Registriert: 23. Sep 2014, 16:46
Wohnort: Aachen
OS, Lazarus, FPC: Mac OSX 10.11 | Win 10 | FPC 3.0.0 | L trunk | 
CPU-Target: x86_64, i368, ARM
Nach oben

» Weitere Beiträge siehe nächste Seite »
Nächste

Zurück zu Sonstiges



Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste

porpoises-institution
accuracy-worried