Обработка исключений free_pascal

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

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

Сообщение sts » 06.11.2015 12:00:41

может так поймет:
еслибы программного исключения "деление на ноль" не существовало бы то raise EDivByZero вызывало бы хардварное исключение а это не так.
sts
постоялец
 
Сообщения: 415
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение Лекс Айрин » 06.11.2015 12:29:55

sts, а почему ВЫ думаете, что это не так? Насколько я понимаю весь процесс, в итоге эта команда превращается в ассемблерную инструкцию int 00h. К сожалению, исходники компилятора очень запутаны, поэтому сразу найти подтверждение трудно.

Добавлено спустя 18 минут 26 секунд:
...Если быть на 100 процентов точным, это не совсем так. Например, в Intel-архитектуре возникновение исключения вызывает передачу управления по вектору в обработчик находящийся в нулевом кольце защиты, т.е. в обработчик режима ядра (kernel mode). Обработчик определен соответствующим исключению элементом таблицы дескрипторов прерываний (она же - Interrupt Descriptor Table, или просто - IDT). Я собираюсь пропустить все, что касается кода уровня ядра, и притвориться, что, при возникновении исключения, CPU передает управление прямо в KiUserExceptionDispatcher...

http://qxov.narod.ru/articles/seh/seh.html
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Mikhail » 06.11.2015 13:25:33

Лекс Айрин писал(а):почему ВЫ думаете, что это не так?


Он не думает, он точно знает что это не так. :D
Ну а Вам я так скажу так, команда int в защищенном режиме процессора запрещена для непривелигированных программ.
Я уже молчу о том, что такие вещи в прерываниях никто не реализует. :)
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

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

Сообщение Лекс Айрин » 06.11.2015 13:59:12

Mikhail писал(а):Ну а Вам я так скажу так, команда int в защищенном режиме процессора запрещена для непривелигированных программ.

И что? 1) она там и не нужна. Обработчик это привилегированная процедура (устанавливается он спец функцией ядра) 2) есть некоторые способы обойти данный момент.

Mikhail писал(а):Я уже молчу о том, что такие вещи в прерываниях никто не реализует.


Прерывания (и их обработчики) это преимущественно аварийный клапан и средство проинформировать операционку о некоторых вещах. Как программный интерфейс они использовались в DOS.

Mikhail писал(а):Он не думает, он точно знает что это не так.


Есть другая информация, и я ей как-то доверяю больше, так как она идет от программеров занимающихся системным программированием. (и просто хакеров)
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Mikhail » 06.11.2015 14:21:23

Лекс Айрин писал(а):она там и не нужна.


Повторю свой вопрос - ты троль?

Лекс Айрин писал(а):Прерывания (и их обработчики) это преимущественно аварийный клапан и средство проинформировать операционку о некоторых вещах. Как программный интерфейс они использовались в DOS.


Опять мимо! :D

Лекс Айрин писал(а):Есть другая информация, и я ей как-то доверяю больше, так как она идет от программеров занимающихся системным программированием. (и просто хакеров)


:mrgreen: :mrgreen: :mrgreen:

Жги дальше!
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

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

Сообщение Лекс Айрин » 06.11.2015 15:11:19

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

Кричать "ты тролль" оно конечно же легче... но... инфа вам предоставлена -- предоставьте свою. Докажите! В процессе нашего диалога я на всякий случай, искал как это реализовано, хотя и знал это.

Вы видите только программный слой предоставляемый операционной системой и библиотекой запуска программ.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение Mikhail » 06.11.2015 15:25:30

Лекс Айрин писал(а): Вы не хотите разобраться в вопросе

Я уже давно разобрался в этом и многих других вопросах, а вот Вы упорно не хотите изучать мат. часть! :D
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

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

Сообщение Лекс Айрин » 06.11.2015 16:02:42

Mikhail, то есть, аргументировать Вы не хотите и утекаете в кусты? Докажите мне, что я не прав? При том, что я точно знаю, что обработка исключений идет от программы к системе (BIOS). (иначе просто пропадает смысл самого механизма).

Хотя, в принципе, возможен и результат, когда исключение гасится системой и дальше уже сам факт исключения попадает в обработчик программы (теоретически это можно), но тогда обработчик программы не может получить адрес возврата! Но это не так. Я вполне могу продолжить выполнение, если программе начхать на сбой.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение sts » 06.11.2015 16:49:04

в общем я тупо накидал под винду (правда на делфе6) пример с делением на ноль и просто генерацией исключения, оттрассировал и убедился что происходит именно так как я думал.

Добавлено спустя 2 минуты 51 секунду:
не думаю что во фрипаскале по другому
sts
постоялец
 
Сообщения: 415
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение Лекс Айрин » 06.11.2015 17:30:27

sts, вы прошлись по обработчикам. По уже выставленным и настроенным. (и, скорее всего, не всем, так как оттрассировать ядро вам никто не даст.) Первым, я так понимаю, был обработчик в программе (ну или выставленный Вами,) скорее всего, как и в лазаре он располагается в System. И дальше идет обработчик самой системы. Но кто сказал, что это не вызываемый аппаратно перекрытый несколько раз обработчик? Или вы трассировали ВСЮ программу? От ее запуска и до самого конца? У меня в процессе отладчик просто заглючил на вызова системного обработчика.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение sts » 06.11.2015 17:44:58

при делении на ноль выполнился кусок кода (кусок всмысле поток исполнения, назовем его - первый) - обработчик хардварных исключений (установленный делфой), в конце был вызван другой кусок кода (второй) который создал объект exception и все что там надо, и далее пошла обработка стека ну как там положено.
а просто raise сразу начал со второго куска.

Добавлено спустя 3 минуты 28 секунд:
со старта я не трассировал
sts
постоялец
 
Сообщения: 415
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение Лекс Айрин » 06.11.2015 18:06:32

sts а сам исходник можно? У меня создалось впечатление, что просто второй обработчик не создавался компилятором, так как Вы указали, что должен пользоваться стандартный обработчик (у вас он второй). И, судя по найденной справке, так и должно быть.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение sts » 06.11.2015 18:18:26

да какой там исходник

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
  a,b,c: integer;
begin
  a:= 10;
  b:= 0;
  try
   c:= a div b;

  except
  on E: EDivByZero do
    raise EDivByZero.Create('!!!!!!');
  end;

  ShowMessage(IntToStr(c));
end;


точку останова на a:= 10; и вперед. в Debug WindowsCPU смотрел ASM

Добавлено спустя 3 минуты 13 секунд:
да еще Use Debug DCUs включил
sts
постоялец
 
Сообщения: 415
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

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

Сообщение Лекс Айрин » 06.11.2015 18:39:33

sts, ну да... простой вызов стандартного обработчика. Но вы зря думаете, что тот кусок , что вызывается вторым (или единственным) это типа программный обработчик. Это обработчик установленный ранее (причем, скорее всего самой дельфи и за ним тогда есть еще и обработчик винды).
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

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

Сообщение cli » 03.12.2015 20:24:40

Вах, сколько ответов)
Всем спасибо!!!
З.Ы. про использование try-except при иоткрытии файлов или потенциальном делении на ноль и.т.п. давно знаю :D
вопрос стоял именно в отключении стандартного обработчика)

Добавлено спустя 23 минуты 25 секунд:
в данном случае как раз не надо раскручивать стек и все такое, нужно просто погасить программу :D
cli
незнакомец
 
Сообщения: 5
Зарегистрирован: 04.11.2015 03:21:35

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 68

Рейтинг@Mail.ru
cron