Обработка системных исключений

classic Classic list List threaded Threaded
4 messages Options
Reply | Threaded
Open this post in threaded view
|

Обработка системных исключений

Yuriy Zhilovets
Привет всем!
Изучаю spf_win_except. Непонятно

1) Где именно происходит выход из системной функции обработки исключения
и какой результат ей передается
2) зачем нужна переменная EXC-HANDLER. Она вроде бы нигде не используется
3) зачем нужно drop-exc-handler. Кто его вызывает и когда?

Ю. Жиловец



Reply | Threaded
Open this post in threaded view
|

Re: Обработка системных исключений

Dmitry Yakimov-2
Привет,

Мы кладем на стек возвратов фрейм исключений и записываем его адрес в
регистр FS процессора.
Когда возникает аппаратное исключение вызывается слово (EXC). Если
аппаратного исключения не возникнет - фрейм сам уберется.

1. А исключение не доходит до системы, поэтому и системная ф-я обработки
исключения не вызывается
2. Переменная EXC-HANDLER нигде не используется, но содержит адрес
текущего фрейма. В принципе не нужна, дублирует 0 FS@ (кроме WNDPROC -
там мы не ставим фрейм исключений и у системы свой)
3. Фрейм исключений в SPF кладется 1 раз на поток (хотя можно было бы
класть каждый CATCH). И drop-exc-handler должен вызываться при выходе
из  USER-INIT/PROCESS-INIT.

Код инициализации форт системы такой:
CALL TC-FORTH-INSTANCE> (здесь <SET-EXC-HANDLER> кладет на стек
возвратов адрес DROP-EXT-HANDLER)
CALL INIT
RET (здесь мы вызываем DROP-EXT-HANDLER)

Yuriy Zhilovets wrote:

> Привет всем!
> Изучаю spf_win_except. Непонятно
>
> 1) Где именно происходит выход из системной функции обработки исключения
> и какой результат ей передается
> 2) зачем нужна переменная EXC-HANDLER. Она вроде бы нигде не используется
> 3) зачем нужно drop-exc-handler. Кто его вызывает и когда?
>
> Ю. Жиловец
>
>
> -------------------------------------------------------------------------
> This SF.net email is sponsored by DB2 Express
> Download DB2 Express C - the FREE version of DB2 express and take
> control of your XML. No limits. Just data. Click to get it now.
> http://sourceforge.net/powerbar/db2/
> _______________________________________________
> Spf-dev mailing list
> [hidden email]
> https://lists.sourceforge.net/lists/listinfo/spf-dev
>  



Reply | Threaded
Open this post in threaded view
|

Re: Обработка системных исключений

Yuriy Zhilovets
Dmitry Yakimov пишет:

>1. А исключение не доходит до системы, поэтому и системная ф-я обработки
>исключения не вызывается
>  
>
Я неправильно сформулировал. Раз мы уже попали в EXC, значит, вызвано
системное исключение.
Мы его обрабатываем, но потом мы где-то должны вернуться из этой функции
и вернуть результат ядру ОС.
Где же мы возвращаем результат (продолжать работу или нет)?
Если не возвращаться, то мы остаемся в callback с чужим стеком.

>3. Фрейм исключений в SPF кладется 1 раз на поток (хотя можно было бы
>класть каждый CATCH). И drop-exc-handler должен вызываться при выходе
>из  USER-INIT/PROCESS-INIT.
>
>  
>
Теперь понятно. А почему недостаточно одного фрейма на процесс?

Ю. Жиловец



Reply | Threaded
Open this post in threaded view
|

Re: Обработка системных исключений

Dmitry Yakimov-2
Yuriy Zhilovets wrote:

> Dmitry Yakimov пишет:
>
>  
>> 1. А исключение не доходит до системы, поэтому и системная ф-я обработки
>> исключения не вызывается
>>  
>>
>>    
> Я неправильно сформулировал. Раз мы уже попали в EXC, значит, вызвано
> системное исключение.
> Мы его обрабатываем, но потом мы где-то должны вернуться из этой функции
> и вернуть результат ядру ОС.
> Где же мы возвращаем результат (продолжать работу или нет)?
> Если не возвращаться, то мы остаемся в callback с чужим стеком.
>  
Нет, не остаемся. Мы либо восстанавливаем стек данных и возвратов в
THROW, либо безопасно делаем ExitThread, если не было CATCH.

>> 3. Фрейм исключений в SPF кладется 1 раз на поток (хотя можно было бы
>> класть каждый CATCH). И drop-exc-handler должен вызываться при выходе
>> из  USER-INIT/PROCESS-INIT.
>>
>>  
>>
>>    
> Теперь понятно. А почему недостаточно одного фрейма на процесс?
>
>  

Регистр FS у каждого потока свой.

Дмитрий.