AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Verspätete Fehlermeldung

Ein Thema von Bomberbb · begonnen am 3. Nov 2005 · letzter Beitrag vom 4. Nov 2005
Antwort Antwort
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#1

Verspätete Fehlermeldung

  Alt 3. Nov 2005, 14:18
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...
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.643 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Verspätete Fehlermeldung

  Alt 3. Nov 2005, 14:42
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.
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#3

Re: Verspätete Fehlermeldung

  Alt 3. Nov 2005, 14:46
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#4

Re: Verspätete Fehlermeldung

  Alt 4. Nov 2005, 08:45
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!!!
  Mit Zitat antworten Zitat
Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.643 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Verspätete Fehlermeldung

  Alt 4. Nov 2005, 09:07
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).
Sven Harazim
--
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Verspätete Fehlermeldung

  Alt 4. Nov 2005, 16:37
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
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Bomberbb

Registriert seit: 23. Sep 2003
227 Beiträge
 
#7

Re: Verspätete Fehlermeldung

  Alt 4. Nov 2005, 23:22
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...
  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 05:33 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