Тема: Поддержка исключений и RtlUnwind
Имеется в KolbiriOS какая-либо поддержка исключений для прикладных программ? Есть ли аналог RtlUnwind из Windows, раскручивающая стек? Описана ли функция в заголовках для Delphi?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Канторовы системы → Delphi SDK для KolibriOS → Поддержка исключений и RtlUnwind
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Имеется в KolbiriOS какая-либо поддержка исключений для прикладных программ? Есть ли аналог RtlUnwind из Windows, раскручивающая стек? Описана ли функция в заголовках для Delphi?
поддержка исключений для прикладных программ
В документации по системным функциям есть такие функции
Описана ли функция в заголовках для Delphi?
В файле KolibriOS.pas есть вот это
но примеров использования пока нет
На самом деле я спрашивал про RtlUnwind. Установка обработчика исключений в KolibriOS вроде с самого начала. Он разве не нужен для работы отладчика?
Установка обработчика исключений в KolibriOS вроде с самого начала.
Он разве не нужен для работы отладчика?
RtlUnwind
Среди системных функций такого нет.
Добавлено 2020-06-25 в 22:39
{68.24} Function SetExceptionHandler(Handler: Pointer; Mask: Dword; Var OldMask: Dword): Pointer; StdCall; External 'KolibriOS';
C этой функцией тоже есть проблемы
для того, чтобы установить обработчик исключений нужно
type
TExceptionKind = (ekDivide, ekDebug, ekNonMaskInt, ekBreakPoint, ekOverflow,
ekBoundRange, ekInvalidOpcode, ekDevNotAvailable, ekDoubleFault,
ekCoprSegmOver, ekInvalidTSS, ekSegmentNotPresent, ekStack,
ekGeneralProtection, ekPageFault, ekReserved, ekFPU,
ekAlignmentCheck, ekMachineCheck, ekSSE);
..........................................................
// в случае возникновения исключения в соответствии с установленной маской, будет вызвана эта процедура, на стеке будет номер исключения, поэтому процедура stdcall
procedure ExceptionHandler(Kind: TExceptionKind); stdcall;
begin
..........................................................
end;
..........................................................
var
OldExceptionMask: LongWord;
..........................................................
// здесь устанавливаем обработчик, передаём адрес процедуры ExceptionHandler, желаемую маску, в данном случае $FFFFF
SetExceptionHandler(@ExceptionHandler, $FFFFF, OldExceptionMask);
значения номеров(констант) исключений брал отсюда
Сперва тестировал в VirtualBox.
Если просто запустить этот пример из программы RUN или файлового менеджера,
то в консоли будет выведено только "General-Protection"
а если же запустить этот пример из-под отладчика(программа "mtdbg")
в некоторый момент по какой-то причине запускается второе окно консоли,
в диспетчере задач(программа "CPU") становится 3 потока консоли.
но если это новое окно активировать мышью, то этот третий поток умирает
на доске отладки(программа "BOARD", вкладка "kernel") появляется
сообщение о том, что поток умер
Потом я всё же решил загрузиться на реальном железе
в принципе всё то же самое
ещё могу добавить, что после изменения настроек скорости указателя мыши
при запуске kiv(Kolibri Image Viewer) настройки снова сбиваются,
но при запуске других программ проблем не было, только kiv почему-то
В общем, больше похоже, что проблема где-то в ядре
иначе как вообще такое возможно?
так что пока исключениями в Delphi заниматься, думаю, рано ещё
Добавлено 2020-06-26 в 18:38
Второе окно консоли могло запуститься, если снова вызвать InitConsole.
Каким-то образом передалось туда управление
Надо ещё разбираться
Добавлено 2020-06-26 в 22:00
мда... под отладчиком и без него — результаты разнятся
но это пока в VirtualBox, а там была проблема при отладке http://board.kolibrios.org/viewtopic.ph … 904#p68065
При возникновении исключения в обработчике с помощью SetExceptionActivity снова устанавливается сброшенный после исключения флаг.
Потом управление снова передаётся на тот же адрес, снова исключение...
Программа ожидаемо зацикливается.
Надо по идее прыгать из обработчика на другой адрес.
Это чтобы можно было сделать try...finally.
После try компилятор сохраняет адрес, куда нужно перейти в случае исключения.
Добавлено 2020-06-27 в 01:25
попробовал ещё пример с выводом на доску отладки(приложение BOARD, это приложение также при запуске сохраняет информацию на tmp-диске в файл boardlog.txt)
это тестировалось в VirtualBox
В общем, больше похоже, что проблема где-то в ядре
иначе как вообще такое возможно?
так что пока исключениями в Delphi заниматься, думаю, рано ещё
Что и требовалось доказать. Реальной поддержкой исключений из ЯВУ пока никто не озадачивался, вот в ядре она и нерабочая до сих пор.
Да, с этим пока не ясно.
Вот есть тема Как сделать полноценный SEH
Там, кстати, упоминается ещё TLS(Thread Local Storage), TLS в Колибри, который понадобится для приложений с несколькими потоками, использующими обработчик исключений.
bw написал на форуме KolibriOS, что в FreePascal у него есть исключения.
в FreePascal у него есть исключения
Вряд ли это работает
Судя по выводу на BOARD до блока "finally" управление не дошлоа на вкладке "kernel" приложения BOARD было сообщение о вылете программы
Возникла мысль, что поддержка исключений может быть темой Google Summer of Code 2021. Но я не смогу быть ментором. И занят, и внутренности не так хорошо знаю. 0CodErr, не возьмешься?
Поддержка исключений должна быть полной, чтобы аппаратные исключения тоже перехватывались и транслировались RTL целевого языка. Насколько это реально?
Тут ещё похоже, что сама системная функция
{68.24} Function SetExceptionHandler(Handler: Pointer; Mask: Dword; Var OldMask: Dword): Pointer; StdCall; External 'KolibriOS';
работает не совсем так, как ожидается(судя по документации).
И плюс нужно TLS ещё.
Да и какой из меня ментор
Сейчас просматривают: 1 гость, 0 пользователей
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Канторовы системы → Delphi SDK для KolibriOS → Поддержка исключений и RtlUnwind
Форум работает на PunBB, при поддержке Informer Technologies, Inc