Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung (https://www.delphipraxis.net/206320-zugriffsverletzung-access-violation-64bit-jedoch-nicht-32bit-anwendung.html)

delphitrixer 9. Dez 2020 13:18

Delphi-Version: 10.3 Rio

Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung
 
Hallo

Ein sehr grosses Delphi-Projekt erzeugt als 64bit Anwendung kompiliert in sehr seltenen, unregelmässigen und nicht reproduzierbaren Abständen an unterschiedlichen Stellen eine Zugriffsverletzung (Access Violation). Wird die Anwendung 1:1 als 32bit Anwendung kompiliert, funktioniert alles über Tage und Monate absolut fehlerfrei ohne auch nur einemal einen Fehler zu haben.

Wie erwähnt, lässt sich der Fehler nie reproduzieren und der volle Funktionsumfang der Anwendung läuft manchmal über Stunden ohne eine Zugriffsverletzung. Dort wo der Fehler auftritt, tritt er bei einem weiteren Versuch nicht mehr auf. Es ist völlig zum verzweifeln und das Verhalten ist auch absolut unlogisch.

Kann mir vielleicht jemand einen Tipp geben wie man einem solchen Problem begegnet?
Was können die Ursachen dafür sein, dass die Anwendung absolut fehlerfrei läuft wenn diese als 32bit Applikation erzeugt wurde aber nicht als 64bit Version?

Tools wie EurekaLog wurden schon eingesetzt aber konnten leider nicht helfen, da der Fehler eben nie reproduzierbar ist und eh nur äusserst selten und nicht immer auftritt.

Die Access-Violations werden protokolliert und alles was ich habe sind die Speicheradressen an denen der Fehler jeweils aufgetreten ist. Zum Beispiel so:

Zugriffsverletzung bei Adresse 0000000001BC2782 in Modul 'xyz.exe'

Wie findet man aufgrund dieser Information heraus wo der Fehler entstanden ist und was die Ursache dafür war? Und warum nur als 64bit Anwendung? Und was nützt die Information, wenn beim nächsten Versuch an selber Stelle keine Fehler entsteht?


Vielleicht hat jemand ein paar gute Tips was man noch tun könnte. Ich bin wirklich dankbar für jede Anregung.

Danke und Gruss
Delphitrixer

hoika 9. Dez 2020 13:39

AW: Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung
 
Hallo,
kompiliere mit MadExept, dann wird dir die Stelle zumindestens angezeigt.

Union 9. Dez 2020 14:14

AW: Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung
 
Zitat:

Zitat von delphitrixer (Beitrag 1478806)
Hallo
Tools wie EurekaLog wurden schon eingesetzt aber konnten leider nicht helfen, da der Fehler eben nie reproduzierbar ist und eh nur äusserst selten und nicht immer auftritt.

Um es zu reproduzieren muss die Anwendung dann selbstverständlich so lange laufen, bis auch ein Fehler auftritt, der von Eurekalog (oder MadExcept) protokolliert und analyisert werden kann.

Anhand des Mapfiles und der ausgegebenen Adresse kannst Du die Stelle evtl. auch selber finden, es sei denn es handelt sich um eine externe Exception.

freimatz 9. Dez 2020 14:30

AW: Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung
 
Zitat:

Zitat von delphitrixer (Beitrag 1478806)
Kann mir vielleicht jemand einen Tipp geben wie man einem solchen Problem begegnet?
Was können die Ursachen dafür sein, dass die Anwendung absolut fehlerfrei läuft wenn diese als 32bit Applikation erzeugt wurde aber nicht als 64bit Version?

Zum Beispiel undefinierte weil nicht initialisierte Variablen. In 32-Bit liegt dann halt "zufällig" was auf dem Stack, was nicht zu einem Fehler führt.

Was tun? "Halt" sauber programmieren. ;-). FixInsight.
Und das bereits anderweitig erwähnte.

Amateurprofi 9. Dez 2020 15:41

AW: Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung
 
Ich gehe bei solchen Fehlern so vor:
1) BreakPoint setzen z.B. auf erster Zeile im FormCreate oder so.
2) Anwendung starten
3) Wenn am BreakPoint angehalten wird in die CPU-Ansicht wechseln.
4) Dort mit Strg-G zu der Adresse gehen, die in der Exception angegeben wird, im Beispiel aus #1 wäre die Adresse $1BC2782.

Dort wird dann in der Regel die Zeilennummer und der Pascal-Code gezeigt bei der der Fehler auftritt.
Mit dieser Information kannst du dir dann Gedanken machen, was der Auslöser sein könnte.

jziersch 9. Dez 2020 15:45

AW: Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung
 
Zitat:

Zugriffsverletzung bei Adresse 0000000001BC2782 in Modul 'xyz.exe'
Das sieht nach einer 64 bit Adresse aus, die mit 32 bit initialisiert wurde.

Ich würde so anfangen zu suchen:

1) Suche nach "Cardinal(" im gesamten Quellcode. Beim Pointer auf Int casten ein IntPtr nehmen.
2) Suche nach "Integer(" s.o.
3) Wurde für ein Handle statt eines THandle oder HWND ein Cardinal verwendet?

venice2 9. Dez 2020 21:14

AW: Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung
 
Kann nicht direkt was beitragen hatte aber auch ein gravierendes Problem mit Arrays 64Bit/32Bit, 32Bit gibt mir die falsche länge zurück.

delphitrixer 11. Dez 2020 07:03

AW: Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung
 
Hallo Zusammen

Ich bedanke mich schon einmal für Eure wertvollen Tips.

So wie es aussieht, handelt es sich um eine externe Adresse bzw. die AV entsteht in einer der eingesetzten und zugekauften Komponenten. Das muss ich aber noch genau prüfen.

Ich gehe jetzt einmal Eure Lösungsansätze durch. Könnte eine weile dauern, da ich wie erwähnt den Fehler auf meiner Entwicklungsumgebung noch nie reproduzieren konnte und auch sonst sehr selten auftritt.

Aber Danke vorerst Euch allen.

Wer noch mehr oder andere Lösungsansätze kennt, gerne weiter posten. :-D

delphitrixer 11. Dez 2020 07:13

AW: Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung
 
Zitat:

Zitat von jziersch (Beitrag 1478816)
Das sieht nach einer 64 bit Adresse aus, die mit 32 bit initialisiert wurde.

Wie kann man denn eine Adresse in 32bit initialisieren wenn die Anwendung 64bit läuft? Wird da nicht automatisch alles mit 64bit initialisiert?

delphitrixer 11. Dez 2020 09:41

AW: Zugriffsverletzung (Access Violation) in 64bit jedoch nicht in 32bit Anwendung
 
Zitat:

Zitat von Amateurprofi (Beitrag 1478815)
Ich gehe bei solchen Fehlern so vor:
1) BreakPoint setzen z.B. auf erster Zeile im FormCreate oder so.
2) Anwendung starten
3) Wenn am BreakPoint angehalten wird in die CPU-Ansicht wechseln.
4) Dort mit Strg-G zu der Adresse gehen, die in der Exception angegeben wird, im Beispiel aus #1 wäre die Adresse $1BC2782.

Dort wird dann in der Regel die Zeilennummer und der Pascal-Code gezeigt bei der der Fehler auftritt.
Mit dieser Information kannst du dir dann Gedanken machen, was der Auslöser sein könnte.

Danke Amateurprofi. Dein Tipp hat schon einmal sehr geholfen. Damit konnte ich herausfinden, dass die AV definitiv in einer der verwendeten, zugekauften Komponenten von TMS entsteht. Das grenzt die Lösungssuche schon einmal sehr ein. :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:07 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