AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Code Optimierung erzeugt Zugriffsverletzung
Thema durchsuchen
Ansicht
Themen-Optionen

Code Optimierung erzeugt Zugriffsverletzung

Ein Thema von databoss · begonnen am 20. Apr 2016 · letzter Beitrag vom 21. Apr 2016
Antwort Antwort
databoss

Registriert seit: 2. Mär 2006
Ort: Hamburg
3 Beiträge
 
#1

Code Optimierung erzeugt Zugriffsverletzung

  Alt 20. Apr 2016, 21:35
Hallo Forum,

Ich habe einen sehr merkwürdigen Fehler, der mich bereits Stunden gekostet hat und für den ich bisher keine gute Lösung gefunden habe.
Vielleicht hat das jemand von Euch schon einmal etwas ähnliches gesehen?

Ich verwende das ORM Aurelius von TMS Software, dort im Forum habe ich leider keine Lösung bekommen.
Die Objekte werden dort per Framework automatisch erzeugt. Zwischen den Objekten Adresse und Person besteht eine 1:n Relation, dadurch wird Person.Adresse normalerweise mit dem passenden Daten befüllt, was sehr praktisch ist. Das lief bisher völlig problemlos.

Folgender Code:
Delphi-Quellcode:
   PersonList := FRepository.GetPersonList(MyKunde, 0, ''); // TList<TPerson>
   if PersonList.Count>0 then
     MyPerson := PersonList.Items[0];
   if MyPerson = nil then
   begin
     WriteLog('PDFLetter.CreateRechnung: Error: Person not found!');
     Exit;
   end;
   MyKunde := MyPerson.Kunde; // ohne Problem
   MyAdresse := MyPerson.Adresse; // << Zugriffsverletzung
   MyAdresse := FRepository.GetAdresse(MyPerson.Adresse.uid); // << genauso hier
Wenn ich nun compiliere mit Debug Einstellungen (ohne Code Optimierung) läuft alles ohne Probleme.
Aber mit den Release Einstellungen (mit Code Optimierungen) kommt es zu einer Zugriffsverletzung in der letzten Zeile.

Durch Logging habe ich herausgefunden, dass das Problem der Zugriff auf das Objekt MyPerson.Adresse ist, egal wie ich das versuche.
Es kommt zu immer zu folgendem Fehler:

Exception in class $C0000005 with message 'access violation at 0x01329c4c: read of address 0x00000005'

Sehr merkwürdig ist, dass ich ein ganz ähnliches Objekt habe MyPerson.Kunde habe und es dort mit und ohne Code Optimierung ohne Probleme geht.

Ich verwende Delphi Seattle 10 mit FireDAC und einer MSSQL DB dahinter.

Mit ist klar, dass dies vermutlich zumindest auch an dem verwendeten Aurelius Framework liegt, aber ich verstehe nicht wo und warum der Code Optimierer Grund zum wegoptimieren des Objektes Person.Adresse sieht und bei Person.Kunde nicht.

Derzeit habe ich die Code Optimierung auch für die Release builds ausgeschaltet, nicht schön aber geht.

Eine Idee? Schon einmal gehabt?
Was kann ich tun?
Florian
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

AW: Code Optimierung erzeugt Zugriffsverletzung

  Alt 20. Apr 2016, 22:07
Wird das Objekt MyAdress auch irgendwo erzeugt? Und ist sicher gestellt, dass MyPerson.Adress auch ein gültiges Objekt enthält?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
HeZa

Registriert seit: 4. Nov 2004
Ort: Dortmund
182 Beiträge
 
Delphi 10 Seattle Professional
 
#3

AW: Code Optimierung erzeugt Zugriffsverletzung

  Alt 20. Apr 2016, 23:25
...Eine Idee? Schon einmal gehabt?...Was kann ich tun?
Wir hatten so ein Problem schon mal mit einer bestimmten FireDac Version (auf jeden Fall vor Delphi 10 Seattle). Wir hatten die FireDAC Sourcen mit kompiliert und das funktionierte nur wenn wir keine Optimierung verwendet hatten. Als Lösung haben wir die Pfade so korrigiert, das wieder die mit FireDAC gelieferten DCUs verwendet wurden.

Vielleicht einen Versuch wert?
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Code Optimierung erzeugt Zugriffsverletzung

  Alt 21. Apr 2016, 01:03
Meiner Erfahrung nach, werden solche Fehler, die nur bei aktiver Optimierung auftreten zu 99% durch Memory-Corruption verursacht. Ich vermute, dass irgendwo im Programm ein Buffer Overflow auftritt.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

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

AW: Code Optimierung erzeugt Zugriffsverletzung

  Alt 21. Apr 2016, 04:22
Zumindest im hier gezeigten Code wird MyPerson nur zugewiesen, wenn PersonList.Count größer als 0 ist. Ansonsten ist es nicht initialisiert, wofür es auch eine Compilerwarnung geben sollte.
Da fehlt ein else, in dem es z.B. auf nil gesetzt wird bzw. gleich der folgende Code für nicht zugewiesen ausgeführt wird.

Nicht initialisiert bedeutet, dass beliebige Werte drin sein können, die sich dann je nach eingestellter Codegenerierung unterscheiden können.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

AW: Code Optimierung erzeugt Zugriffsverletzung

  Alt 21. Apr 2016, 10:41
Wurde MyPerson auch initialisiert, falls das IF mal nix trifft? :atupid:
Und was sagt der Compiler dazu? (Meldungen)
$2B or not $2B

Geändert von himitsu (21. Apr 2016 um 10:43 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 17:06 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