Page 1 of 1

Исключения

Posted: Wed Mar 21, 2007 12:13 pm
by bw
Здравствуйте.
Должен признаться я не достточно хорошо разбираюсь в отлове исключений на уровне железа или определенной ОСи. Мне всегда хвалато того что весь этот механизм преподносился мне, как на блюдичке, языками высокого уровня.
Сейчас, в своей работе по адаптации RTL FreePascal, я подошел к моменту, когда необходима реализация обработчика. В w32 эта реализация начинается с функции SetUnhandledExceptionFilter, чем её можно заменить в KOS? Если вас не затруднит, расскажите немного подробнее. Интересно было бы посмотреть и на рабочий пример (желательно небольшого объема).
После решения этого вопроса я подойду к тому что бы выложить первую альфу этого RTL, с небольшими примерами и комментариями.

..bw

Posted: Wed Mar 21, 2007 1:58 pm
by Serge
bw

В Колибри нет поддержки исключений. Только для FPU и SSE. Программа вызывает сервис и передаёт адрес своей функции обработчика. Когда произойдёт исключение система подправит стек и управление вернётся на эту функцию. Дальше всё зависит от обработчика. Если он сделает ret то управление вернётся на адрес где было исключение. Код системных обработчиков в core/fpu.inc

P.S. У Ghost-а были идеи на эту тему.

Posted: Wed Mar 21, 2007 2:15 pm
by bw
Очень плохо. Полагаю что на уровне приложения этот вопрос решить нельзя?!
Хотелось бы увидеть поддержку исключений в ядре в ближайщее время :-).
Падение приложений без информирования пользователя (хотя бы) очень не красиво.

..bw

Posted: Wed Mar 21, 2007 2:18 pm
by Serge
bw

Пока кто-нибудь не напишет - не появится.

Информация отображается на доске отладки (Board).

Posted: Wed Mar 21, 2007 3:33 pm
by Phantom-84
bw, описанное и есть системный механизм обработки исключений...
Программа вызывает сервис и передаёт адрес своей функции обработчика. Когда произойдёт исключение система подправит стек и управление вернётся на эту функцию.
Только в Kolibri, видимо, не обрабатываются отдельно целочисленные исключения типа деления на ноль или переполнения, а также исключение по факту доступа к зарезервированной, но не распределенной памяти.
Все остальное можно реализовать на чисто прикладном уровне.