Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2015.10.18;
Скачать: CL | DM;

Вниз

Как проигнорировать Invalid floating operation exception?   Найти похожие ветки 

 
@!!ex ©   (2015-02-26 19:07) [0]

Ситуация:
ATI драйвер при работе с декодером DXT5 вываливает ошибку "floating point invalid  operation exception".
MSVC++ эту ошибку благополучно игнорирует и все работает ок. Дельфи на это исключение вываливает сообщение и продолжение работы невозможно. Потому что на каждый кадр таких ошибок вываливаются сотни.

Вариант: "не работать с этим кодом" не подходит, потому что это драйвер и избежать работы с ним не получится.

Гугель предлагает при старте приложения вырубить проверку вот таким кодом:
Set8087CW($133f);
Это не помогает.

Какие варианты?


 
@!!ex ©   (2015-02-26 19:44) [1]

Ну и пожалуй рановато я задал вопрос.
Надо было чуть дольше поразбираться:
SetExceptionMask(GetExceptionMask() + [exInvalidOp]);


 
Dimka Maslov ©   (2015-02-27 11:15) [2]


> Гугель предлагает при старте приложения вырубить проверку
> вот таким кодом:
> Set8087CW($133f);


Флаг исключений сопроцессора един для всех процессов. Поэтому его надо устанавливать перед каждой операцией с вещественными числами.


 
han_malign ©   (2015-02-27 14:41) [3]

в Delphi еще иногда помогает тупо asm FINIT end; перед вызовом внешних кодеков...
какие-то странные махинации с флагами сопроцессора там с древних времен еще остались...


 
Rouse_ ©   (2015-02-28 11:56) [4]


> @!!ex ©   (26.02.15 19:44) [1]
> Ну и пожалуй рановато я задал вопрос.
> Надо было чуть дольше поразбираться:
> SetExceptionMask(GetExceptionMask() + [exInvalidOp]);

Черезчур кардинально. Проставь векторный обработчик исключений и фильтруй их по EIP - если не твое адресное пространство - пропускай наружу.


 
Rouse_ ©   (2015-02-28 11:57) [5]

Точнее наоборот, если не твой модуль - глуши исключение, остальное наружу отдавай.


 
@!!ex ©   (2015-02-28 20:06) [6]


> Черезчур кардинально. Проставь векторный обработчик исключений
> и фильтруй их по EIP - если не твое адресное пространство
> - пропускай наружу.

Не. Производительность умрет.
Драйвер генерит очень много исключений. Чуть ли не на каждый рисуемый меш. Если я буду на каждое тако исключение делать проверки - потеряю производительность на пустом месте.

Чем грозит такое глобальное отключение?


 
Rouse_ ©   (2015-02-28 22:10) [7]

Не умрет, исключения всеравно кто-то обрабатывает, просто в текущем варианте, незаметно для тебя :)


 
Rouse_ ©   (2015-02-28 22:14) [8]

Кстати, можешь маленький демопример накатать, воспроизводящий ошибку? Есть у меня одна идейка, но нужно ее обкатать


 
Rouse_ ©   (2015-02-28 22:16) [9]

Желательно и на сях и на дельфе, пусть там к приперу обычный прямоугольник на фрейме рисуется, главное чтоб воспроизводилось


 
Inherited ©   (2015-03-01 00:36) [10]

> Rouse_ ©   (28.02.15 22:10) [7]
> Не умрет, исключения всеравно кто-то обрабатывает, просто
> в текущем варианте, незаметно для тебя :)


Мне кажется при соответствующих флагах сопроцессора эксепшн просто не генерируется

@!!ex ©   (26.02.15 19:07)
> Set8087CW($133f);
> Это не помогает.Какие варианты?


Была аналогичная ситация, я делаю Set8087CW($037F);
У меня помечено, что это дефолтные флаги сопроцессора для Intel CC


 
@!!ex ©   (2015-03-04 12:38) [11]


> Кстати, можешь маленький демопример накатать, воспроизводящий
> ошибку? Есть у меня одна идейка, но нужно ее обкатать

Могу. Позднее.



Страницы: 1 вся ветка

Текущий архив: 2015.10.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.007 c
2-1400900914
mfender
2014-05-24 07:08
2015.10.18
Вопрос по теории. Нетипизированные параметры в методах.


2-1400941622
Y
2014-05-24 18:27
2015.10.18
program can t start because rtl70.bpl is missing from your comput


15-1425159004
Юрий
2015-03-01 00:30
2015.10.18
С днем рождения ! 1 марта 2015 воскресенье


1-1333638734
Unknown user
2012-04-05 19:12
2015.10.18
Список всех ресурсных строк приложения


11-1249495316
D[u]fa
2009-08-05 22:01
2015.10.18
SVN, BUGS and etc