Параметры компилятора Delphi 6 (Pentium-безопасный FDIV) - PullRequest
3 голосов
/ 10 сентября 2010

Я получил сообщение о сбое от MadExcept от пользователя. Исключением является недопустимая операция с плавающей запятой.

Странно то, что стек вызовов умирает в @ FSafeDivide.

Я сделал гугл и обнаружил, что это проверка для определенных чипов Pentium, которые делали неправильно. Если тест не пройден, все деления будут выполняться программно, а не аппаратно. В настройках компилятора включена опция Pentium-Safe FDIV.

Может ли это быть причиной ошибки? Я также читал где-то еще, что EInvalidOp, который был классом исключения, может быть переполнением стека или чем-то еще.

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

класс исключений: EInvalidOp сообщение об исключении: недопустимая операция с плавающей запятой.

thread $1014 (TMyBossThread):
00403509 M5b3.exe System                @FSafeDivide
008300c9 M5b3.exe MMyWorkerThread    317 TMyBossThread.Search
0073e87a M5b3.exe MMyManagerThread 186 TMyWorkerThread.Execute
008e8c17 M5b3.exe madExcept             HookedTThreadExecute
0042c150 M5b3.exe Classes               ThreadProc
00405354 M5b3.exe System                ThreadWrapper
008e8af9 M5b3.exe madExcept             CallThreadProcSafe
008e8b63 M5b3.exe madExcept             ThreadExceptFrame
created by main thread ($864) at:
0073e828 M5b3.exe MMyManagerThread 171 TMyManagerThread.Create

Ответы [ 3 ]

2 голосов
/ 10 сентября 2010

Во-первых, если у вас на самом деле нет людей, работающих на ранних чипах Pentium I, вам, вероятно, следует отключить эту опцию компилятора.Это связано с ошибкой в ​​нескольких конкретных процессорах, и ни у одного чипа, проданного с 1995 года, проблем не было.вероятно, где-то в вашем коде, тем более что FSafeDivide - это процедура, которая должна давать правильные результаты.Посмотрите на TMyBossThread.Search, строка 317, и посмотрите, что там делится.Также посмотрите на строку 316, поскольку трассировки стека могут иногда указывать вам на строку после той, которая вам нужна.

1 голос
/ 22 июня 2012

В этой (немецкой) статье описан случай, когда при включении безопасного деления Pentium (tm) ($ U +) исправлена ​​ошибка предотвращения выполнения данных в системе Windows 2003 Server с включенным DEP:

http://entwickler -forum.de / archive / index.php / t-41207.html

В Delphi 2009 все еще есть этот флаг компилятора со значением по умолчанию $ U- (без Pentium (tm) -безопасное разделение.

Таким образом, даже если мы можем забыть об аппаратной части (сломанные процессоры), она все равно может иметь значение в зависимости от «функций» операционной системы, таких как DEP

1 голос
/ 10 сентября 2010

Несколько комментариев, прежде чем искать в стоге сена:

  • «Если это не воспроизводимо, это не ошибка, а аномалия». Не тратьте время на что или почему, а на то, как вы можете воссоздать это.
  • Как сказал Мейсон, возможно, пришло время удалить эту опцию компилятора. (D6 почти 10 лет)
  • Знаете ли вы, происходит ли это на определенной версии Windows? Например, Text-To-Speech, хорошо работающий на XP, дает «деление с плавающей точкой на ноль ошибок» в Vista и выше.
  • Предположим, что ваш код выглядит нормально, что называется, что включает в себя некоторые операции с плавающей точкой?

Последние 2 относятся к проблемам с испорченными регистрами FPU:
См. Здесь взаимодействие с .Net и справку в Set8087CW для OpenGL

.
...