Преобразование исключений с плавающей запятой в исключения C ++ - PullRequest
7 голосов
/ 17 сентября 2008

Возможно ли преобразовать исключения (сигналы) с плавающей запятой в исключения C ++ в x86 Linux?

Это для целей отладки, поэтому непереносимость и несовершенство вполне допустимы (например, если не гарантируется 100%, что все деструкторы вызваны).

Ответы [ 5 ]

8 голосов
/ 18 сентября 2008

Если ваша реализация стандартной библиотеки C ++ поддерживает функции TR1 fetestexcept, feraiseexcept и feclearexcept (у меня еще нет, поэтому я не могу это проверить), вы можете обнаружить пять видов ошибок с плавающей запятой, а затем можете выдавать любые исключения, какие захотите.

См. здесь для описания этих функций.

Я также рекомендую раздел 12.3 «Управление средой с плавающей запятой» книги Расширения стандартной библиотеки C ++: учебное пособие и справочник , автор Pete Becker, ISBN-13: 9780321412997, для превосходного описания из этих функций с примером кода.

alt text

3 голосов
/ 18 сентября 2008

опция gcc -fnon-call-exceptions может вам пригодиться. Не удалось найти никакой документации, поэтому ваш пробег может отличаться.

3 голосов
/ 17 сентября 2008

Из-за того, как работают сигналы и исключения, вы не можете сделать это немедленно, когда генерируется сигнал - исключения зависят от определенных аспектов стека, которые не выполняются при вызове обработчика сигнала.

Вы можете установить глобальную переменную в обработчике сигналов, а затем проверить это в ключевых точках программы и вызвать исключение, если оно установлено. Это не дает вам точную информацию о сгенерированном исключении.

1 голос
/ 17 сентября 2008

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

Вы можете установить обработчик сигнала для SIGFPE и использовать его в своих целях отладки.

0 голосов
/ 17 сентября 2008

Основная идея заключается в том, чтобы установить соответствующие обработчики сигналов для исключений с плавающей запятой. Внутри вашего обработчика сигналов вы можете выдать исключение (или отправить определенный пользователем сигнал другому процессу, который вызовет исключение, или отправить сообщение другому потоку для чего-то подобного и т. Д. И т. Д. И т. Д.). Существует множество способов вызвать исключение - главное - обработать сигнал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...