Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Verspätete Fehlermeldung (https://www.delphipraxis.net/56298-verspaetete-fehlermeldung.html)

Bomberbb 3. Nov 2005 13:18


Verspätete Fehlermeldung
 
Hallo,

ich habe folgendes Problem: Wenn ich mein recht großes Programm debugge, kommt es ab und zu vor, dass eine Gleitkommadivision durch 0 nicht sofort vom Debugger gemeldet wird (auch Getlasterror ist 0). Das ist erst der Fall bei dem nächsten mal, dass ich trunc aufrufe. Ich kann den eigendlichen Fehler also nur finden indem ich zeilenweise trunc einsetze...

a:=trunc(a);
procedureA;
a:=trunc(a);
ProcedureB;
a:=trunc(a);
...

Das ganze ist nun mal ziemlich kompliziert und ich wollte mal fragen, ob da schon jemand was ähnliches erlebt hat. Ich benutze Delphi5 prof und WinXP...

sh17 3. Nov 2005 13:42

Re: Verspätete Fehlermeldung
 
Wir hatten das Problem, das bei einigen AMD-Prozessoren gar keine Exception bei Division durch 0 kam, dementsprechend nur Müll in der Zielvariable stand.

D.h. -> Division durch 0 vermeiden, also vorher prüfen, ob eine Division durch 0 stattfinden wird. Wenn ja, definierten Zielwert von Hand setzen oder was weis ich.

Ist ne Menge arbeit, aber hilft garantiert.

alcaeus 3. Nov 2005 13:46

Re: Verspätete Fehlermeldung
 
Moin BomberBB,

nehmen wir mal folgenden Code:
Delphi-Quellcode:
procedure TForm1.DoDivisionByZero();
var
  Res: Integer;
begin
  Res := 5 / 0;
end;

procedure TForm1.DoSomething();
begin
  ShowMessage('Before');
  DoDivisionByZero();
  ShowMessage('After');
end;
Der Cursor wird beim zweiten ShowMessage haengen bleiben, bzw.: er bleibt bei der ersten Anweisung nach dem Fehler haengen. Z.B.:
Delphi-Quellcode:
procedure TForm1.DoDivisionByZero();
var
  Res: Integer;
begin
  Res := 5 / 0;
  ShowMessage('Don''t go any further'); //Hier bleibt der Cursor stehn
end;

procedure TForm1.DoSomething();
begin
  ShowMessage('Before');
  DoDivisionByZero();
  ShowMessage('After');
end;
Wenn die fehlerhafte Anweisung die letzte in einer Funktion ist, so bleibt der Cursor an der Zeile nach dem Aufruf stehn.

Greetz
alcaeus

Bomberbb 4. Nov 2005 07:45

Re: Verspätete Fehlermeldung
 
Hallo,

ich habe gestern noch einige Zeit im Internet verbracht und bin nach langem Suchen auf die Lösung gekommen. Die Variable Default8087CW stand auf $133F, was die FPU-Fehlermedungen unterdrückt. nach dem Aufruf von

Set8087CW($1332);

funktioniert wieder alles so wie es soll. Ich habe auch nachgeschaut, wo das gesetzt wird. Und zwar habe ich einen OpenGLHeader eingebunden, in diesem wird diese FPU-Fehlerüberprüfung ausgeschaltet
(Sie soll wohl zu ungenau für gewisse 3D-Berechnungen sein).

BomberBB

p.s.: Danke für die Antworten!!!

sh17 4. Nov 2005 08:07

Re: Verspätete Fehlermeldung
 
das ist richtig, auf diese Stelle sind wir damals auch gekommen. Wir hatten auch erst die entsprechende Funktion in unsere Software eingebaut. Nur ist diese FPU-Variable von Prozessor zu Prozessor verschieden gesetzt und am System herumreparieren war uns dann zu ...

Deswegen fährt man mit obiger Variante besser (unabhängiger).

Bernhard Geyer 4. Nov 2005 15:37

Re: Verspätete Fehlermeldung
 
Zitat:

Zitat von Bomberbb
ich habe folgendes Problem: Wenn ich mein recht großes Programm debugge, kommt es ab und zu vor, dass eine Gleitkommadivision durch 0 nicht sofort vom Debugger gemeldet wird (auch Getlasterror ist 0). Das ist erst der Fall bei dem nächsten mal, dass ich trunc aufrufe. Ich kann den eigendlichen Fehler also nur finden indem ich zeilenweise trunc einsetze...

Hast Du evtl. einen HP-Drucker-Treiber installiert oder machst Du etwas mit DirectX?
In beiden Fällen kann es AFAIK vorkommen das das Exception-Handling vom BS aus Performance-Gründen/Programmier-Fehlern teilweise ausgehebelt/abgeschaltet wurde. (Siehe Thread im Entwickler-Forum

Bomberbb 4. Nov 2005 22:22

Re: Verspätete Fehlermeldung
 
Hallo Bernhard,

wie gesagt, ich habe den Fehler bereits lokalisiert. Im Initialisierungsteil des von mir benutzten OpenGlHeaders steht die Zeile

Set8087CW($133F);

Und fiese schaltet die Fehlerbearbeitung in der FPU aus. Nach setzen von

Set8087CW($1332);

läuft alles wieder normal...

...aber dovan ab, hör auf mit HP-Treibern... , da kann ich ein Lied von singen...


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