OberonCore https://forum.oberoncore.ru/ |
|
Возможно ли избавиться от окна трэпа? https://forum.oberoncore.ru/viewtopic.php?f=2&t=5797 |
Страница 1 из 1 |
Автор: | Valery Solovey [ Суббота, 02 Июль, 2016 00:17 ] |
Заголовок сообщения: | Возможно ли избавиться от окна трэпа? |
Я пытался использовать Kernel.SetTrapGuard, но он заменяет одно окно на другое. |
Автор: | Info21 [ Суббота, 02 Июль, 2016 00:51 ] |
Заголовок сообщения: | Re: Возможно ли избавиться от окна трэпа? |
Задача не понятна. Видимо, недостаточно использовать трап № 128? |
Автор: | Valery Solovey [ Суббота, 02 Июль, 2016 12:52 ] |
Заголовок сообщения: | Re: Возможно ли избавиться от окна трэпа? |
Используемый трап заранее не известен. Более того, он может возникнуть не благодаря ASSERT. Скажем, выход за границы массива. Я хочу написать программу для запуска юнит-тестов. Самая простая часть уже сделана: получение из модуля списка процедур, тестирующих какой-то другой модуль, и запуск процедур. Теперь хотелось бы, чтобы по окончании работы программы она выдавала мини-отчёт: какая процедура отработала без проблем, а какая завершилась с ошибками. Как продолжить работу, если выскочил трап, понятно. Как извлечь информацию о последнем трапе - тоже, вроде, можно разобраться. Но как сделать, чтобы окно трапа не появлялось? Если семнадцать процедур завершились с ошибками, то появится семнадцать окон трапа, с которыми непонятно, что делать. И очевидно, что сразу все семнадцать они нужны не будут. |
Автор: | Иван Денисов [ Суббота, 02 Июль, 2016 13:00 ] |
Заголовок сообщения: | Re: Возможно ли избавиться от окна трэпа? |
Надо установить свой обработчик аварийных остановок через Kernel.InstallTrapViewer Примеры реализации обработчиков: StdDebug и DevDebug. |
Автор: | Valery Solovey [ Суббота, 02 Июль, 2016 15:00 ] |
Заголовок сообщения: | Re: Возможно ли избавиться от окна трэпа? |
Он же глобальный? Я бы ещё как-нибудь выкрутился, если бы был доступ к текущему TrapViewer-у. Вызвал бы свой обработчик, и потом установил предыдущий. А так просто вслепую задавать свой обработчик чревато сбросом чьего-нибудь чужого обработчика. Да и для доступа к стандартным потребуется изменить интерфейс модулей, в которых они находятся. |
Автор: | Иван Денисов [ Суббота, 02 Июль, 2016 20:09 ] |
Заголовок сообщения: | Re: Возможно ли избавиться от окна трэпа? |
Пометьте в ядре переменную trapViewer с доступом для чтения и пересоберите Блэкбокс. Тогда сможете хранить старый обработчик и потом возвращать назад. |
Автор: | Илья Ермаков [ Суббота, 02 Июль, 2016 21:25 ] |
Заголовок сообщения: | Re: Возможно ли избавиться от окна трэпа? |
Если уж понадобилось, я бы не стал пересобирать ББ, а просто забрал значение с помощью SYSTEM (обособив все эти танцы в каком-то отдельном модуле). |
Автор: | Пётр Кушнир [ Воскресенье, 03 Июль, 2016 01:09 ] |
Заголовок сообщения: | Re: Возможно ли избавиться от окна трэпа? |
https://bitbucket.org/oberoncore/ypk/sr ... ew-default |
Автор: | Valery Solovey [ Воскресенье, 03 Июль, 2016 22:37 ] |
Заголовок сообщения: | Re: Возможно ли избавиться от окна трэпа? |
Если я правильно понял, как это работает, то это не то, что мне надо. У меня есть процедура. Она обращается к другим процедурам, в которых могут быть разные ассерты или ошибки (например, выход за границы массива). И я хочу, чтобы в таком случае не показывалось окно трапа. |
Автор: | Valery Solovey [ Воскресенье, 03 Июль, 2016 22:51 ] |
Заголовок сообщения: | Re: Возможно ли избавиться от окна трэпа? |
А как правильно использовать SYSTEM для получения значения переменной? Раньше удавалось избегать использования SYSTEM. Я придумал так: 1. Получить модуль m := Kernel.ThisMod("Kernel"); 2. Найти по имени нужную переменную Kernel.GetRefProc(ref, adr, name); Kernel.GetRefVar(ref, mode, form, desc, adr, name); 3. Адрес переменной указан относительный, поэтому складываем его с базой S.GET(m.varBase + adr, p); Всё верно? Или можно проще? |
Автор: | Пётр Кушнир [ Понедельник, 04 Июль, 2016 00:24 ] |
Заголовок сообщения: | Re: Возможно ли избавиться от окна трэпа? |
Valery Solovey писал(а): Если я правильно понял, как это работает, то это не то, что мне надо. У меня есть процедура. Она обращается к другим процедурам, в которых могут быть разные ассерты или ошибки (например, выход за границы массива). И я хочу, чтобы в таком случае не показывалось окно трапа. Вы неправильно поняли. ypkSysTry делает как раз то, что вы хотите - перехватывает исключение от рантайма с помощью Kernel.Try и дополнительной магии. Следовательно, никакого окна Trap не будет и исполнение не прервётся. Если же вы хотите чтобы исполнение прервалось, но без окошка - изучите модули StdDebug и DevDebug, которые открывают окно ошибки и работают по принципу исталлируемого хука. А могли бы в файл сохранять, или вообще игнорировать. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |