AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]
Thema durchsuchen
Ansicht
Themen-Optionen

Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

Ein Thema von AuronTLG · begonnen am 4. Dez 2024 · letzter Beitrag vom 5. Dez 2024
Antwort Antwort
Seite 1 von 3  1 23      
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
291 Beiträge
 
Delphi 12 Athens
 
#1

Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

  Alt 4. Dez 2024, 10:20
Moin,
ich hätte hier mal ein Problem wo ich Tipps gebrauchen könnte.
Ich habe ein Programm, an dem ich zur Vorversion einige Änderungen durchgeführt habe. Dieses Programm hat weiterhin eine Anmeldemaske, bei der man auch direkt wieder abbrechen und es damit schließen kann.

Mir ist beim Kompilieren nun zufällig aufgefallen, dass, wenn ich das Programm direkt in der Anmeldemaske schließe, das Programmsymbol in der Taskleiste unten verschwindet, dann aber direkt nochmal das Programm wieder in der Taskleiste aufploppt, nur ohne Icon, und nach paar Sekunden entweder wieder verschwindet, oder aber auch häufig folgenden Fehler schmeißt:

Zitat:
Die Anweisung in 0x000000000A695DF4 verwies auf
Arbeitsspeicher bei 0x000000000A695DF4. Der Vorgang
written konnte im Arbeitsspeicher nicht durchgeführt
werden.

Klicken sie auf "OK", um das Programm zu beenden.
Wenn ich mich anmelde, das Programm dementsprechend vollständig startet und ich es dann schließe, ist alles wunderbar.
Geschlossen wird das Programm über Application.Terminate, was auch problemlos ausgeführt wird. Das Problem manifestiert sich also irgendwo in den abschließenden Operationen der Windows-API, die ja vom Terminate ausgelöst werden.
Das Problem ist unabhängig vom PC nachvollziehbar und tritt mit der Programmvorversion (selbe Delphi-Version) nicht auf, also habe ich es in irgendeiner Form hineingebaut.

Eine genauere Beschreibung kann ich leider nicht geben, da ich in der Version einiges, aber nichts technisch außergewöhnliches, gemacht habe und momentan keinen Anhaltspunkt dafür habe, was das ausgelöst haben könnte.

Hat jemand Ahnung bzw Erfahrung damit, was solch einen Fehler für gewöhnlich auslösen kann? Ich sehe diesen nämlich zum ersten Mal und das Internet liefert mir viel zu viele Möglichkeiten, die aber nicht hierzu passen.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.654 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

  Alt 4. Dez 2024, 10:34
Bekommst du den Fehler im Debugger nicht? Dort solltest du ja mehr sehen können, insbesondere den Stacktrace.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
291 Beiträge
 
Delphi 12 Athens
 
#3

AW: Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

  Alt 4. Dez 2024, 10:53
Damit habe ich eben mal etwas herumprobiert.
Im Debugger bekomme ich nicht immer dasselbe, aber beim am häufigsten auftretenden Fehler hält er tief in der CPU.
Der Stacktrace sieht in diesem Fall von oben nach unten mehr oder weniger folgendermaßen aus:

Zitat:
C:\WINDOWS\SysWOW64\user32.dll
user32.SendMessageW + 0x46
Vcl.Controls.DestroyChildWindow(???,???)
user32.EnumChildWindows + 0x8c
Vcl.Controls.TWinControl.DestroyHandle
Vcl.Controls.TWinControl.CMRecreateWnd(???)
Vcl.Controls.TControl.WndProc(???)
Vcl.Controls.TWinControl.WndProc((45107, 0, 0, 0, 0, 0, (), 0, 0, (), 0, 0, ()))
Vcl.Controls.TControl.Perform(???,???,0)
Vcl.Forms.TCustomForm.WndProc((45145, 0, 0, 0, 0, 0, (), 0, 0, (), 0, 0, ()))
Vcl.Controls.TWinControl.MainWndProc(???)
System.Classes.StdWndProc(2820586,45145,0,0)
C:\WINDOWS\SysWOW64\user32.dll
user32.SendMessageW + 0x46
Vcl.Themes.TStyleManager.SetStyle(???)
Vcl.Styles.Finalization
System.FinalizeUnits
System._Halt0
Ich bin mir dabei nicht sicher, wie sehr ich mich auf diesen Fehlerstack versteifen sollte. Ich verwende VCL-Styles, habe an diesen aber im Vergleich zu vorigen Version eigentlich nichts geändert. Wenn diese Exception mein Problem sein sollte, kann das vielleicht auch ein Folgefehler sein?

Ergänzung: Wegen Optimierung kann ich im Debugger leider keine genaueren Information dazu sehen, was da genau passiert, wie z.B. welche WinControl etc das ist.

Geändert von AuronTLG ( 4. Dez 2024 um 10:56 Uhr)
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
659 Beiträge
 
Delphi 12 Athens
 
#4

AW: Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

  Alt 4. Dez 2024, 11:07
Hast du die Debug-DCUs eingeschaltet? Falls nicht, mach das mal, dann landest du ggf. an einer aussagekräftigeren Stelle und kannst dich besser an die Stelle in deinem Code hangeln, wo das Problem auftritt.
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
291 Beiträge
 
Delphi 12 Athens
 
#5

AW: Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

  Alt 4. Dez 2024, 11:14
Debug-DCUs sind angeschaltet.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.654 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

  Alt 4. Dez 2024, 11:23
Deaktiviere am besten mal testweise die Styles.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
291 Beiträge
 
Delphi 12 Athens
 
#7

AW: Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

  Alt 4. Dez 2024, 11:39
Mit deaktivierten Styles tritt das Problem immer noch auf, war also ein Folgefehler; die Exception, bei der er im Debugger anhält, ist jedoch anders.
Anhalten tut er natürlich in der CPU, der Stack sieht aber dann folgendermaßen aus:

Zitat:
:09703206
:0970232c
:0964a82e
:76807ba9 KERNEL32.BaseThreadInitThunk + 0x19
:779ec0cb ntdll.RtlInitializeExceptionChain + 0x6b
:779ec04f ntdll.RtlClearBits + 0xbf
Da das alles in der CPU hängt, kann ich da leider nicht viel mehr rauslesen.
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
691 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

  Alt 4. Dez 2024, 12:22
Hey, nach dem was du beschreibst würde ich darauf tippen das ein anderer Thread nicht mitbekommen hat dass der Main Thread nicht mehr existiert und noch fröhlich Daten sendet.
Das kann immer passieren. Deshalb sollte jeder Thread ein ordentliches Fehlerhandling haben damit das nicht bis ins System durchrauscht.
Application.Terminate ist generell keine Lösung zum geregelten Beenden eines Programms.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
704 Beiträge
 
Delphi 12 Athens
 
#9

AW: Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

  Alt 4. Dez 2024, 12:47
Moin,
ich hätte hier mal ein Problem wo ich Tipps gebrauchen könnte.
Ich habe ein Programm, an dem ich zur Vorversion einige Änderungen durchgeführt habe. Dieses Programm hat weiterhin eine Anmeldemaske, bei der man auch direkt wieder abbrechen und es damit schließen kann.

Mir ist beim Kompilieren nun zufällig aufgefallen, dass, wenn ich das Programm direkt in der Anmeldemaske schließe, das Programmsymbol in der Taskleiste unten verschwindet, dann aber direkt nochmal das Programm wieder in der Taskleiste aufploppt, nur ohne Icon, und nach paar Sekunden entweder wieder verschwindet, oder aber auch häufig folgenden Fehler schmeißt:
Wo wird das Anmeldeform erzeugt und angezeigt? Aus einem Event des Mainforms oder per Kode im DPR-File? Das ist vermutlich relevant da das von Application.Terminate gesetzte Flag erst greift, wenn Application.Run ausgeführt wird. Da kann dann noch so einiges ausgeführt werden nachdem das Anmeldeform geschlossen wurde.
Peter Below
  Mit Zitat antworten Zitat
AuronTLG

Registriert seit: 2. Mai 2018
Ort: Marburg
291 Beiträge
 
Delphi 12 Athens
 
#10

AW: Die Anweisung in [...] verwies auf Arbeitsspeicher bei [...]

  Alt 4. Dez 2024, 13:09
Zitat:
Wo wird das Anmeldeform erzeugt und angezeigt? Aus einem Event des Mainforms oder per Kode im DPR-File? Das ist vermutlich relevant da das von Application.Terminate gesetzte Flag erst greift, wenn Application.Run ausgeführt wird. Da kann dann noch so einiges ausgeführt werden nachdem das Anmeldeform geschlossen wurde.
Per Code im DPR File vor dem Application.Run. War in der vorigen Version aber genauso. Im ganzen DPR-File hat sich nichts Relevantes geändert.

Zitat:
Hey, nach dem was du beschreibst würde ich darauf tippen das ein anderer Thread nicht mitbekommen hat dass der Main Thread nicht mehr existiert und noch fröhlich Daten sendet.
Das kann immer passieren. Deshalb sollte jeder Thread ein ordentliches Fehlerhandling haben damit das nicht bis ins System durchrauscht.
Application.Terminate ist generell keine Lösung zum geregelten Beenden eines Programms.
Ich werde sicherheitshalber mal etwaige Threads überprüfen. Update: Zu diesem Zeitpunkt sind keine eigenen Threads am laufen.
Abgesehen davon, Terminate wird nur zum Schließen bei der Anmeldung verwendet, ansonsten läuft es über die Hauptform. Was wäre denn in diesem Fall die bessere Option? Terminate ist doch eine sehr sanfte Option zum codeseitigen Schließen des Programmes.

Geändert von AuronTLG ( 4. Dez 2024 um 13:41 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:23 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