Текущий архив: 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