![]() |
![]() |
Обработка ошибок и отладка
|
Обработка ошибок и отладка
leJOS NXJ предоставляет несколько механизмов для обработки ошибок и отладки, включая:
Механизм удалённого мониторинга и пошаговой отладки (tracing facility), который описан ниже в отдельном разделе, может также использоваться для отладки. Исключения (Exceptions)Большинство стандартных классов исключений языка Java поддерживается leJOS и пользователь может также создавать свои собственные классы исключений. Пример: Следующий тестовый пример программы, демонстрирующий работу исключений, покажет, что может случиться, если исключение не перехвачено (в данном случае ArrayIndexOutOfBounds exception).
Когда этот код запускается "кирпич" NXT показывает экран необработанного исключения. Этот экран выглядит примерно так:
Но о чём эти числа нам говорят? Первая строка сообщает номер класса-исключения, который был выборошен, в данном случае класс 28. Следующие строки показывает миниатюрный дамп стека, по одной на каждый метод в стеке вызовов, показывается номер метода и положение program counter-а внутри метода. Самый верхний пункт - это место, где было выброшено исключение (в данном случае это произошло в месте (at location) 11 в методе номер 20. Так что теперь мы понимаем что означают числа, но как соотнести их с нашей программой? Один из способов - использовать verbose output линкера, сокращённая версия которого выглядит примерно так:
Мы можем использовать таблицу классов чтоб найти в ней класс исключения - в нашем случае класс 28 это java.lang.ArrayIndexOutOfBoundsException так что мы теперь знаем, что столкнулись с ошибкой выхода за пределы массива. Теперь мы можем посмотреть имена методов. Метод 20 это метод ExceptionTest.m1, метод 21 это ExceptionTest.m2 и метод 22 это ExceptionTest.main. Это говорит нам о том, что исключение было выброшено в методе m1, который был вызван из метода m2, который, в свою очередь, был вызван из метода main. Это хорошо, но как мы используем значение location counter чтоб сузить диапазон поиска места, где возникло исключение? Мы можем декомпилировать байт-код классов и использовать это, но может есть способ полегче? Да есть. Вместе с leJOS идут два инструмента, которые сильно упрощают процесс отладки, один помогает декодировать упомянутые выше номера локаций, другой делает всю работу за нас. Оба инструмента требуют, чтоб вы использовали при линковке опцию -od, которая говорит линкеру, чтоб он добавлял дополнительную отладочную информацию в указанный файл. Имея этот файл, мы можем ипользовать NXJDebugTool чтоб декодировать данные от исключения как показано ниже:
Как вы можете видеть, этот инструмент точно указывает на номер строки, где произошло исключение, в исходном коде. И последняя возможность отладки это использовать leJOS remote console application (приложение удалённой консоли leJOS) (подробнее смотрите ниже). Опять же, нам нужны некоторые дополнительные опции линковки: в этот раз -od чтоб добавить информацию для отладки и -gr чтоб добавить дополнительный отладочный код для работы с удалённой консолью. Если мы слинкуем с этими опциями и запустим программу снова, то мы заметим три изменения: во-первых, программа будет ожидать remote console application чтоб соединиться с ней, во-вторых, любой вывод, который использует поток System.out будет перенаправлен на отладочную консоль (в данном случае будет выведено слово "Running") и, наконец, информация об исключении будет отображена на удалённой консоли в удобной для восприятия форме. Смотрите ниже пример:
Data AbortsЕсли происходит сбой в работе прошивки leJOS - вы, наверняка, захотите получить Data Abort (здесь тоже не до конца уловил тонкости грамматики, в оригинале предложение выглядело так: "If the leJOS firmware crashes you will normally a Data Abort.") На экране будут показано значение регистра PC на котором произошёл сбой и другая информация о сбое. На экране будет приблизительно следующее: DATA ABORT PC 00140BAC AASR 1831BF01 ASR 00020601 OPCODE ??? DEBUG1 00020010 DEBUG2 00000000 Наиболее распространённая причина data abort-a это исполнение файла, который не является бинарным файлом leJOS NXJ, или исполнение "битого"(incomplete) исполняемого файла leJOS NXJ. Если у вас произошёл data abort в каком-либо другом случае, необходимо сообщить об ошибке команде разработчиков leJOS путём размещения детального описания вашей ситуации на форуме leJOS NXJ. Удалённая отладкаВы можете использовать PC как удалённую консоль для отображения отладочных (трассировочных) сообщений, сгенерированных программой, работающей на стороне робота. У класса lejos.nxt.comm.RConsole есть методы для этого. Т.к. экземпляров этого класса не создаётся, то все методы статические. Чтоб начать отладку, используйте один из этих методов:
На дисплее робота высвечивается и начинается ожидание, когда программа-монитор на стороне PC соединится. затем запускается программа nxjconsole на PC. Когда соединение установится,
дисплей робота ("кирпича"-NXT) высветит Если вы используете вариант открытия с таймаутом, то происходит ожидание указанного количества секунд и, если отладочный монитор не подключен, программа робота продолжает работу без возможности отладки/трассировки. Если таймаут задан равным нулю, то время ожидания - бесконечное. Можно также использовать приложение ConsoleViewer чтоб отображать трассировочные/отладочные сообщения. Отладочные сообщения могут быть выведены с помощью следующих методов:
Если вызов open завершился неудачей (соединение не было установлено), отладочные сообщения будут отброшены. Если соединение было установлено успешно, строка появится на потоке стандартного вывода в окне или терминале с которого была запущена на PC nxjconsole . Когда отладка завершается, вы должны вызвать на стороне робота:
Это приведёт к закрытию USB или Bluetooth соединения. Пример:
|