Обработка исключений free_pascal
Модератор: Модераторы
может так поймет:
еслибы программного исключения "деление на ноль" не существовало бы то raise EDivByZero вызывало бы хардварное исключение а это не так.
еслибы программного исключения "деление на ноль" не существовало бы то raise EDivByZero вызывало бы хардварное исключение а это не так.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
sts, а почему ВЫ думаете, что это не так? Насколько я понимаю весь процесс, в итоге эта команда превращается в ассемблерную инструкцию int 00h. К сожалению, исходники компилятора очень запутаны, поэтому сразу найти подтверждение трудно.
Добавлено спустя 18 минут 26 секунд:
http://qxov.narod.ru/articles/seh/seh.html
Добавлено спустя 18 минут 26 секунд:
...Если быть на 100 процентов точным, это не совсем так. Например, в Intel-архитектуре возникновение исключения вызывает передачу управления по вектору в обработчик находящийся в нулевом кольце защиты, т.е. в обработчик режима ядра (kernel mode). Обработчик определен соответствующим исключению элементом таблицы дескрипторов прерываний (она же - Interrupt Descriptor Table, или просто - IDT). Я собираюсь пропустить все, что касается кода уровня ядра, и притвориться, что, при возникновении исключения, CPU передает управление прямо в KiUserExceptionDispatcher...
http://qxov.narod.ru/articles/seh/seh.html
Лекс Айрин писал(а):почему ВЫ думаете, что это не так?
Он не думает, он точно знает что это не так.
Ну а Вам я так скажу так, команда int в защищенном режиме процессора запрещена для непривелигированных программ.
Я уже молчу о том, что такие вещи в прерываниях никто не реализует.
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Mikhail писал(а):Ну а Вам я так скажу так, команда int в защищенном режиме процессора запрещена для непривелигированных программ.
И что? 1) она там и не нужна. Обработчик это привилегированная процедура (устанавливается он спец функцией ядра) 2) есть некоторые способы обойти данный момент.
Mikhail писал(а):Я уже молчу о том, что такие вещи в прерываниях никто не реализует.
Прерывания (и их обработчики) это преимущественно аварийный клапан и средство проинформировать операционку о некоторых вещах. Как программный интерфейс они использовались в DOS.
Mikhail писал(а):Он не думает, он точно знает что это не так.
Есть другая информация, и я ей как-то доверяю больше, так как она идет от программеров занимающихся системным программированием. (и просто хакеров)
Лекс Айрин писал(а):она там и не нужна.
Повторю свой вопрос - ты троль?
Лекс Айрин писал(а):Прерывания (и их обработчики) это преимущественно аварийный клапан и средство проинформировать операционку о некоторых вещах. Как программный интерфейс они использовались в DOS.
Опять мимо!
Лекс Айрин писал(а):Есть другая информация, и я ей как-то доверяю больше, так как она идет от программеров занимающихся системным программированием. (и просто хакеров)
Жги дальше!
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Mikhail, если лично Вы не хотите разобраться в вопросе, это не значит, что другие не хотят или не могут... Есть куча информации, которая позволяет понять как взаимодействуют программы и аппаратура. Как, зачем и почему... а также с какого боку и каким образом.
Кричать "ты тролль" оно конечно же легче... но... инфа вам предоставлена -- предоставьте свою. Докажите! В процессе нашего диалога я на всякий случай, искал как это реализовано, хотя и знал это.
Вы видите только программный слой предоставляемый операционной системой и библиотекой запуска программ.
Кричать "ты тролль" оно конечно же легче... но... инфа вам предоставлена -- предоставьте свою. Докажите! В процессе нашего диалога я на всякий случай, искал как это реализовано, хотя и знал это.
Вы видите только программный слой предоставляемый операционной системой и библиотекой запуска программ.
Лекс Айрин писал(а): Вы не хотите разобраться в вопросе
Я уже давно разобрался в этом и многих других вопросах, а вот Вы упорно не хотите изучать мат. часть!
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
Mikhail, то есть, аргументировать Вы не хотите и утекаете в кусты? Докажите мне, что я не прав? При том, что я точно знаю, что обработка исключений идет от программы к системе (BIOS). (иначе просто пропадает смысл самого механизма).
Хотя, в принципе, возможен и результат, когда исключение гасится системой и дальше уже сам факт исключения попадает в обработчик программы (теоретически это можно), но тогда обработчик программы не может получить адрес возврата! Но это не так. Я вполне могу продолжить выполнение, если программе начхать на сбой.
Хотя, в принципе, возможен и результат, когда исключение гасится системой и дальше уже сам факт исключения попадает в обработчик программы (теоретически это можно), но тогда обработчик программы не может получить адрес возврата! Но это не так. Я вполне могу продолжить выполнение, если программе начхать на сбой.
в общем я тупо накидал под винду (правда на делфе6) пример с делением на ноль и просто генерацией исключения, оттрассировал и убедился что происходит именно так как я думал.
Добавлено спустя 2 минуты 51 секунду:
не думаю что во фрипаскале по другому
Добавлено спустя 2 минуты 51 секунду:
не думаю что во фрипаскале по другому
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
sts, вы прошлись по обработчикам. По уже выставленным и настроенным. (и, скорее всего, не всем, так как оттрассировать ядро вам никто не даст.) Первым, я так понимаю, был обработчик в программе (ну или выставленный Вами,) скорее всего, как и в лазаре он располагается в System. И дальше идет обработчик самой системы. Но кто сказал, что это не вызываемый аппаратно перекрытый несколько раз обработчик? Или вы трассировали ВСЮ программу? От ее запуска и до самого конца? У меня в процессе отладчик просто заглючил на вызова системного обработчика.
при делении на ноль выполнился кусок кода (кусок всмысле поток исполнения, назовем его - первый) - обработчик хардварных исключений (установленный делфой), в конце был вызван другой кусок кода (второй) который создал объект exception и все что там надо, и далее пошла обработка стека ну как там положено.
а просто raise сразу начал со второго куска.
Добавлено спустя 3 минуты 28 секунд:
со старта я не трассировал
а просто raise сразу начал со второго куска.
Добавлено спустя 3 минуты 28 секунд:
со старта я не трассировал
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
sts а сам исходник можно? У меня создалось впечатление, что просто второй обработчик не создавался компилятором, так как Вы указали, что должен пользоваться стандартный обработчик (у вас он второй). И, судя по найденной справке, так и должно быть.
да какой там исходник
точку останова на a:= 10; и вперед. в Debug WindowsCPU смотрел ASM
Добавлено спустя 3 минуты 13 секунд:
да еще Use Debug DCUs включил
Код: Выделить всё
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 включил
- Лекс Айрин
- долгожитель
- Сообщения: 5723
- Зарегистрирован: 19.02.2013 16:54:51
- Откуда: Волгоград
- Контактная информация:
sts, ну да... простой вызов стандартного обработчика. Но вы зря думаете, что тот кусок , что вызывается вторым (или единственным) это типа программный обработчик. Это обработчик установленный ранее (причем, скорее всего самой дельфи и за ним тогда есть еще и обработчик винды).
Вах, сколько ответов)
Всем спасибо!!!
З.Ы. про использование try-except при иоткрытии файлов или потенциальном делении на ноль и.т.п. давно знаю
вопрос стоял именно в отключении стандартного обработчика)
Добавлено спустя 23 минуты 25 секунд:
в данном случае как раз не надо раскручивать стек и все такое, нужно просто погасить программу
Всем спасибо!!!
З.Ы. про использование try-except при иоткрытии файлов или потенциальном делении на ноль и.т.п. давно знаю
вопрос стоял именно в отключении стандартного обработчика)
Добавлено спустя 23 минуты 25 секунд:
в данном случае как раз не надо раскручивать стек и все такое, нужно просто погасить программу
