![]() |
+7 (495) 229-0436 | ![]() |
shopadmin@itshop.ru | 119334, г. Москва, ул. Бардина, д. 4, корп. 3 | ![]() |
![]() |
![]() |
|
|
Обработка Segmentation Fault в C++01.11.2011 18:16
Вводная C++ является "небезопасным" ("unmanaged") языком, поэтому программы могут "вылетать" - аварийно завершать работу без сохранения данных пользователя, сообщения об ошибке и т.п. - стоит только, например, залезть в не инициализированную память. Например: или Всем было бы лучше, если бы мы могли "отловить" падение программы - точно так же, как в java ловим исключения - и выполнить хоть что-то перед тем, как программа упадет (сохранить документ пользователя, вывести диалог с сообщением об ошибке и т.п.) Общего решения задача не имеет, так как C++ не имеет собственной модели обработки исключений, связанных с работой с памятью. Тем не менее, мы рассмотрим два способа, использующих особенности операционной системы, вызвавшей исключение. Способ 1: SEH Если Вы используете OS Windows в качестве целевой ОС и Visual C++ в качестве компилятора, то Вы можете использовать Structured Exception Handling - расширение языка С++ от Microsoft, позволяющее отлавливать любые исключения, происходящие в программе. Общий синтаксис обработки исключений выглядит следующим образом: __try Вот "работающий пример" - "скопируй и вставь в Visual Studio" int memento() // обработка Segfault void fall() // генерация segfault int main(int argc, char *argv[]) Мне лично не удалось заставить заработать __finally (поэтому я и написал __except с кодом проверки, который всегда работает), но это, возможно, кривизна моих рук. Данная методика, при всей ее привлекательности, имеет ряд минусов: Один компилятор. Одна ОС. Не "чистый С++". Если Вы хотите работать без средств MS - Вы не сможете использовать эту методику Минусов оказалось настолько много, что приходится искать второе решение. Способ 2: POSIX - сигналы Способ рассчитан на то, что в момент падения программа получает POSIX-сообщение SIGSEGV. Это безусловно так во всех UNIX-системах, но это фактически так (хотя никто не гарантировал, windows - не posix-совместима) и в windows тоже. Методика простая - мы должны написать обработчик сообщения SIGSEGV, в котором программа совершит "прощальные действия" и, наконец, упадет: после чего мы должны зарегистрировать этот обработчик: Вот готовый пример: int memento() int main(int argc, char *argv[]) В отличие от SEH, это работает всегда: решение "многопоточное" (вы можете уронить программу в любом потоке, обработчик запустится в любом случае) и "кроссплатформенное" - работает под любым компилятором, и под любой POSIX-совместимой ОС. Ссылки по теме |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
О нас |
Интернет-магазин ITShop.ru предлагает широкий спектр услуг информационных технологий и ПО.
На протяжении многих лет интернет-магазин предлагает товары и услуги, ориентированные на бизнес-пользователей и специалистов по информационным технологиям. Хорошие отзывы постоянных клиентов и высокий уровень специалистов позволяет получить наивысший результат при совместной работе. В нашем магазине вы можете приобрести лицензионное ПО выбрав необходимое из широкого спектра и ассортимента по самым доступным ценам. Наши менеджеры любезно помогут определиться с выбором ПО, которое необходимо именно вам. Также мы проводим учебные курсы. Мы приглашаем к сотрудничеству учебные центры, организаторов семинаров и бизнес-тренингов, преподавателей. Сфера сотрудничества - продвижение бизнес-тренингов и курсов обучения по информационным технологиям.
|
119334, г. Москва, ул. Бардина, д. 4, корп. 3 +7 (495) 229-0436 shopadmin@itshop.ru |
|
© ООО "Interface Ltd." Продаем программное обеспечение с 1990 года |