какие языки представляют прерывания IEEE 754 разработчику?

Вы говорите: «Я пытался запустить программу как внешнюю программу отладки C ++ DLL ... Но я думаю, что эти параметры могут быть проигнорированы, так как я не могу запустить exe в отладчике ...». Я думаю, что это может быть, где вы идете не так.

Вам нужно установить проект C ++ DLL в качестве запускаемого проекта (щелкните проект правой кнопкой мыши и выберите «Set as StartUp Project»). Затем откройте страницы свойств для проекта и в разделе «Отладка» в поле «Команда» введите полный путь к исполняемому файлу приложения. Введите любые аргументы командной строки, необходимые в поле Command Arguments. Также убедитесь, что ваш проект DLL генерирует PDB в C ++ / General. Очистите и перестройте проект DLL.

Установите точку останова в функции, которую вы ожидаете вызвать - в идеале, где-то рядом с точкой входа, и еще одну точку останова в коде, который вы хотите отладить. Теперь начните отладку (F5). Приложение должно запуститься (точки останова, вероятно, будут выглядеть «выдолбленными» с сообщением о том, что точка останова не привязана или похожа - пока не беспокойтесь об этом). Выполните все действия, необходимые в приложении для вызова собственной библиотеки DLL. Когда DLL и ее PDB загружены, точки останова должны выглядеть непрозрачными и попадать при выполнении строки кода.

Если точка останова не достигнута / не привязана, я бы предложил скопировать C ++ DLL и ее PDB в исполняемую папку приложения, чтобы уменьшить вероятность загрузки неправильной DLL. Затем перезапустите отладчик. Если ваше приложение программно устанавливает рабочую папку, попробуйте скопировать также DLL / PDB в это место.

Если это не удается, это может быть связано с тем, что вызывающий абонент выбирает конфигурацию, несовместимую с вызываемым абонентом. В общем случае не рекомендуется смешивать код режима отладки и выпуска, особенно при сортировке данных. Перестройте библиотеку DLL в режиме выпуска, включая PDB, и выполните приведенные выше инструкции. Все еще возможно отладить код режима релиза, хотя иногда это бывает сложно из-за оптимизаций.

9
задан nraynaud 31 March 2009 в 01:38
поделиться

3 ответа

Насколько я знаю, у Вас есть два варианта для обработки исключения в операции с плавающей запятой в C и C++:

Во-первых, если Вы отключаете/маскируете исключения в операции с плавающей запятой (который большинство сред делает по умолчанию), Вы видите, произошли ли какие-либо исключения в операции с плавающей запятой путем вызова fetestexcept. fetestexcept, не доступно в Visual C++, но можно украсть реализацию Времени выполнения MinGW достаточно легко. (Это находится в общественном достоянии.), После того как исключение было отмечено, оно не очищено, пока Вы не называете feclearexcept, таким образом, можно назвать fetestexcept в конце ряда вычислений, чтобы видеть, повысил ли какой-либо из них исключение. Это не дает Вам прерывания, которые Вы попросили, но это действительно позволяет Вам протестировать, если проблемы как NaN или +/-inf произошли и реагируют по мере необходимости.

Во-вторых, можно позволить/размаскировать исключения в операции с плавающей запятой путем вызова feenableexcept в Linux или _controlfp в Windows. То, как операционная система обрабатывает сгенерированное процессором исключение в операции с плавающей запятой, зависит от Вашей операционной системы.

  • В Linux ОС отправляет сигнал SIGFPE, таким образом, можно установить обработчик сигналов, чтобы поймать это и установить флаг, который говорит стандартной программе реагировать соответственно.
  • В Windows ОС вызывает Structured Exception Handling для преобразования исключения процессора в исключение языка, что можно поймать использование a __try / __catch блок в C или try / catch блок в C++.
  • Обновление: Для Mac OS X, как описано в этом ответе, необходимо смочь позволить/размаскировать использование исключений _MM_SET_EXCEPTION_MASK от xmmintrin.h, и, пока Вы используете параметры компилятора по умолчанию (т.е. не отключайте SSE), необходимо смочь поймать исключения с помощью SIGFPE.

(Я записал немного больше на этом и других проблемах с плавающей точкой в C и C++ в этом сообщении в блоге, если Вам любопытно.)

3
ответ дан 3 November 2019 в 08:21
поделиться

C и вероятно большинство языков, полученных из него как C++ или Python (может быть косвенный доступ хотя). Вероятно, разумно ожидать, что низкоуровневые языки будут иметь такую поддержку.

См. http://www.math.utah.edu/~beebe/software/ieee/#c-notes, который имеет многочисленные сценарии и примечания по работе с числами IEEE 754. В особенности of1.c имеет дело с исключениями в операции с плавающей запятой. Наконец, из источника http://grouper.ieee.org/groups/754/reading.html, который включает набор полезной информации.

0
ответ дан 3 November 2019 в 08:21
поделиться

Я не уверен в том, каков стандарт, но я могу сказать Вам, что я видел на основе опыта, поскольку это может быть полезно. Я кодировал в C++, и NaN иногда являются моим худшим кошмаром. Они появляются тихо и propogate посредством вычисления полностью в конец, пока у меня просто нет бесполезного вывода. Я должен был часто создавать дополнительный код для специфического обнаружения NaN-порождения обстоятельств. Я использую Visual C++ 2008, таким образом, я ожидаю, что он следовал бы стандарту IEEE этим способом.

0
ответ дан 3 November 2019 в 08:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: