Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kein Raise unter 64bit? (https://www.delphipraxis.net/185802-kein-raise-unter-64bit.html)

OlliWW 7. Jul 2015 13:47

Delphi-Version: XE6

Kein Raise unter 64bit?
 
Hallo,

Ich habe meine Anwendung von 32bit nach 64bit portiert. An einigen Stellen habe ich ein:
Delphi-Quellcode:
raise Exception.Create('Fehler');
verbaut.

Unter 32bit wird die Anwendung an diesen Stellen, wie gewünscht, beendet. Unter 64bit wird die Procedur an dieser Stelle zwar abgebrochen, das Programm läuft allerdings weiter ohne auch nur eine Meldung anzuzeigen. Dies führt natürlich zu "lustigen" Folgefehlern.

Ich habe gelesen, dass unter 64bit das Exception Handling wohl umgeschrieben worden ist, allerdings konnte ich nirgendwo ein schönes Beispiel finden, wie man nun ein "raise" oder ähnliches implementiert.

Könnt ihr mir da irgendwie weiterhelfen?

Stevie 7. Jul 2015 16:04

AW: Kein Raise unter 64bit?
 
Exceptions raisen funzt unter 64bit genauso wie unter 32. Der Code ist also korrekt.

Meinst du mit Meldung möglicherweise den Dialog/Breakpoint beim Debuggen? Das ist eine Einstellung (unter Debugger Options->Embarcadero Debuggers->Language Exceptions)

OlliWW 8. Jul 2015 14:58

AW: Kein Raise unter 64bit?
 
Hallo,

Vielen Dank für die Antwort.

Ich habe im FormCreate meiner Appliktion folgendes gesetzt:
Delphi-Quellcode:
  Application.OnException := errMain.WriteException;
Wenn ich diese Anwendung unter 32bit kompiliere, funktioniert es so, wie ich erwarte:
Bei einem Raise wird der Code der Funktion "WriteException" ausgeführt.

Wenn ich den gleichen Code mit 64bit kompiliere wird diese Zuweisung offenbar einfach ignoriert.

Edit:
Ich habe noch etwas probiert:
Ich habe ein Raise hinter einen Button gelegt, das beim OnClick läuft. => Das funktioniert unter 64 bit
Dann habe ich ein Raise in dem Aufruf einer Funktion, einer Procedure, einer Funktion (also etwas verschachteltes) => Das funktioniert nicht

Stevie 8. Jul 2015 15:50

AW: Kein Raise unter 64bit?
 
Zitat:

Zitat von OlliWW (Beitrag 1308093)
Das funktioniert unter 64 bit
...
Das funktioniert nicht

Was funktioniert (nicht)? Das raisen der Exception (Debugger laufen lassen, Exception Dialog kommt) oder das Abarbeiten des OnException handlers.
Das sind nämlich 2 verschiedene Paar Schuhe. Dass das raise an sich nicht funktioniert, möchte ich stark bezweifeln.
Was hingegen aus verschiedenen Gründen den Dienst versagen kann, ist dass der Handler bearbeitet wird.

Generell wär es ziemlich zielführend, wenn du ein Beispiel bereitstellst, wo man das von dir beschriebene Verhalten nachstellen kann.

OlliWW 8. Jul 2015 16:14

AW: Kein Raise unter 64bit?
 
Der Aufruf des Handlers "OnException" funktioniert unter 32bit unter 64bit nicht.

Ein Beispiel ist schwer, wie gesagt, rein oberflächlich funktioniert es ja. Baue ich ein Raise im OnClick ein (zum Beispiel) läuft der Handler. In einer verschachtelten Prozedur nicht.

vagtler 8. Jul 2015 17:13

AW: Kein Raise unter 64bit?
 
Vielleicht verhält sich ja die Prozedur unter 64 bit anders und erreicht die betreffende Stelle gar nicht?

Stevie 8. Jul 2015 19:06

AW: Kein Raise unter 64bit?
 
Zitat:

Zitat von vagtler (Beitrag 1308104)
Vielleicht verhält sich ja die Prozedur unter 64 bit anders und erreicht die betreffende Stelle gar nicht?

Das dachte ich mir auch als allererstes. Aber das wird er ja mit dem Debugger oder Logging bestimmt getestet haben... :roll: :stupid: /ironie

vagtler 8. Jul 2015 20:37

AW: Kein Raise unter 64bit?
 
Stimmt. Mein Fehler. :mrgreen:

OlliWW 8. Jul 2015 22:26

AW: Kein Raise unter 64bit?
 
Zitat:

Zitat von Stevie (Beitrag 1308114)
Zitat:

Zitat von vagtler (Beitrag 1308104)
Vielleicht verhält sich ja die Prozedur unter 64 bit anders und erreicht die betreffende Stelle gar nicht?

Das dachte ich mir auch als allererstes. Aber das wird er ja mit dem Debugger oder Logging bestimmt getestet haben... :roll: :stupid: /ironie

Richtig...
schade ich dachte ich bekomme hier konstruktive Hilfe :roll:

Allerdings wo soll ich da noch groß debuggen:
Es gibt ein: Application.OnException = handler <= diese Zuweisung wird erreicht
und dann gibt es ein Raise <= diese Stelle wird erreicht
Und der Breakpoint an der ersten Zeile des Handler läuft schon nicht

Also die Antwort lautet: Ja unter 64bit Verhält sich das Programm anders.

Sir Rufo 8. Jul 2015 22:40

AW: Kein Raise unter 64bit?
 
Natürlich bekommst du konstruktive Hilfe ... wenn du uns ein SSCCE zur Verfügung stellst.

Oder erwartest du, das wir uns jetzt stundenlang so lange etwas zusammen basteln, bis wir evtl. oder auch nicht dein Problem nachstellen können?

Wenn ja, dann hast du in der falschen Rubrik geschrieben.

OlliWW 8. Jul 2015 22:47

AW: Kein Raise unter 64bit?
 
Man ist als Developer ja nicht immer auf allen Feldern auf "Profi" Niveau. Zum Beispiel befinde ich mich bei der Konvertierung von 32 nach 64bit noch in der Anfangsphase.
Deswegen hatte ich gehofft wäre das für einen Profi vielleicht ein triviales Problem, der dann sowas sagt wie "achja, bei 64bit muss man auf dies und dies achten" und damit wäre das Problem gelößt.

Sir Rufo 8. Jul 2015 22:54

AW: Kein Raise unter 64bit?
 
Einen besseren Profi als Stevie wirst du kaum finden, der wühlt so richtig tief durch den Delphi-Dschungel.

Stevie sagt nein -> also gib uns ein Beispiel, sonst bleibt es beim Nein.

OlliWW 8. Jul 2015 23:01

AW: Kein Raise unter 64bit?
 
Die Software ist leider sehr umfangreich. Einfache Beispiele, die ich versucht habe, haben wunderbar funktioniert.

Ich werde es morgen mit VCL Source mal debuggen um zu sehen was nach dem Raise passiert oder mal TApplicationEvents ausprobieren.

In der Anwendung funktioniert es ja an manchen Stellen, nicht an allen. Dann hatte ich auch schon Threads (wir nutzen an der Stelle keine Threads, aber vielleicht macht ja irgendein Subprozess etwas) im Auge. Allerdings funktioniert es unter 32bit ja.

Ich werde berichten wenn ich etwas finde, das Problem verfolgt uns schon seit einem halben Jahr.

Stevie 8. Jul 2015 23:54

AW: Kein Raise unter 64bit?
 
Zitat:

Zitat von OlliWW (Beitrag 1308141)
schade ich dachte ich bekomme hier konstruktive Hilfe :roll:

Tut mir leid, dass ich außer zielführenden Fragen nichts konstruktives beisteuern kann. Meine :glaskugel: kann nicht alles :)

Nun ja, wir müssen schon gucken, dass wir alle Infos haben, um die Frage zu beantworten. Im Eingangspost schreibst du (Markierungen durch mich):

Zitat:

Zitat von OlliWW (Beitrag 1308141)
Unter 32bit wird die Anwendung an diesen Stellen, wie gewünscht, beendet. Unter 64bit wird die Procedur an dieser Stelle zwar abgebrochen, das Programm läuft allerdings weiter ohne auch nur eine Meldung anzuzeigen. Dies führt natürlich zu "lustigen" Folgefehlern.

Ich muss sagen, da hab ich heute Nachmittag neben meiner Arbeit wohl nicht genau gelesen, aber wat? Eine Exception beendet keine Anwendung. Höchstens der Code, der im Exceptfall ausgeführt wird (aber nen Halt im Exceptionfall wäre schon harter Tobak). Also nochma zum Mitschreiben: Du hast ein Application.OnException Handler, der im Falle einer Exception nicht triggert, richtig? Der Code raised auch eine Exception (im Debugger poppt dann immer son Dialog auf, hallo da war ne Exception, kommt der?) Wenn sich das Verhalten in einem einfachen Fall nicht nachstellen lässt ist ja generell ein Zeichen, dass es allgemein wohl funktioniert, nur in diesem speziellen Fall nicht. Hierfür kann es so einige Gründe haben - mal nach den üblichen Verdächtigen (z.b. Speicher irgendwo überschrieben) geschaut (Stichwort FastMM)? Sind Dinge wie EurekaLog, madExcept oder ähnliches involviert, die sich in die exception Chain hängen?

Sorry, wieder nur mehr Fragen, als Antworten. ;)

Zitat:

Zitat von Sir Rufo (Beitrag 1308148)
Einen besseren Profi als Stevie wirst du kaum finden, der wühlt so richtig tief durch den Delphi-Dschungel.

Das rahm ich mir nun ein 8-) Aber naja, ist wohl zu viel des Lobs, ich hab so meine Schwerpunkte, wo ich nen bisschen Plan von hab - beim Rest halt ich mich einfach meistens bedeckt, dann bemerkt man meine Ahnungslosigkeit nich so schnell :stupid:

Sir Rufo 9. Jul 2015 00:12

AW: Kein Raise unter 64bit?
 
@Stevie

Geht es uns nicht allen so ;)

@OlliWW

Ich an deiner Stelle würde in dem eigenen Code mal nach dem Wort "except" suchen, womöglich gibt es da solche exceptionphobe Konstrukte wie
Delphi-Quellcode:
try
  ...
except
end;
:wink: (womöglich per Compilerschalter nur bei x64 aktiv)

hoika 9. Jul 2015 05:47

AW: Kein Raise unter 64bit?
 
Hallo,

Ein Beispiel ist schwer, wie gesagt, rein oberflächlich funktioniert es ja. Baue ich ein Raise im OnClick ein (zum Beispiel) läuft der Handler. In einer verschachtelten Prozedur nicht.


Dann bitte ein Minimalbeispiel mit einer verschachtelten Prozedur.



Heiko

Bambini 9. Jul 2015 08:09

AW: Kein Raise unter 64bit?
 
Einen Unterschied gibt es zwischen 32 und 64 Bit Exceptions:

Unter 64 Bit gibt es ein Limit von geschachtelten Exception.
Bei mehr als 16 nested Exceptions gibt es ein Runtime error 231.

sh17 9. Jul 2015 09:03

AW: Kein Raise unter 64bit?
 
Zitat:

Zitat von Bambini (Beitrag 1308175)
Einen Unterschied gibt es zwischen 32 und 64 Bit Exceptions:

Unter 64 Bit gibt es ein Limit von geschachtelten Exception.
Bei mehr als 16 nested Exceptions gibt es ein Runtime error 231.

Cool, 16 bit quasi


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