forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=48)
-   -   Техника отладки программ средствами MIDletPascal (http://forum.boolean.name/showthread.php?t=12776)

abcdef 30.06.2010 14:31

Техника отладки программ средствами MIDletPascal
 
Техника отладки программ средствами MIDletPascal.

Java отладка - несколько иная процедура, чем отладка компьютерных программ, т.к. среда не предоставляет средств для трассировки по одной команде, но производители эмуляторов восполняют этот пробел всевозможными мониторами. Например эмулятор из комплекта WTK позволяет отслеживать вызовы сборщика мусора, загрузки классов, исключения, вызовы методов, профилировщик, память, сетевой монитор, и д.р. (после создания проекта зайти в главное меню - Edit - Preferences - вкладка Monitor); Эмулятор KEmulator Lite отображает номер процесса и отслеживает вызовы методов, операции создания объектов, память и д.р. (главное меню - view - options - вкладка system). Информация из эмулятора поступает в стандартный вывод консоли. Консоль также доступна для произвольных сообщений из приложений j2me, для этого присутствует метод System.out.println().

В MIDletPascal имеется две системных функции отладки, работающие через System.out.println():

procedure Assert(cond: boolean) - если cond=false то появляется сообщение "Assertion failed at: Tetris.mpsrc:162", где "Tetris.mpsrc" - имя файла, "162" - номер строки, где стоит вызов Assert.

procedure Debug(s: string) - выводит строку s в консоль

Так консольный вывод, помимо сообщений java-машины, удобно применить для диагностических сообщений при работе с эмулятором, на реальном устройстве консольный вывод обычно игнорируют, однако некоторые телефоны имеют опции для перенаправления консольного вывода на какие-либо устройства.
Например меню в "Motorola V3i - Settings - Java Settings - Switching to Debug:" состоит из "Off", "USB", "Modem", "Bluetooth", "File". При выборе пункта "File" создается файл "/a/mobile/kjava/j2me.log" в него дописываются логи консоли, который нужно очищать если размер превысит 1MB иначе java начнет тормозить.


Пример получения лога консоли в Motorola V3i:

Тестовая программка
program dbgtest;
begin
assert(false);
debug('demo debug from MIDletPascal');
drawText('Hello world!', 0, 0);
repaint;
delay(2000);
end.

Сокращенный лог
############### 06/30/2010 11:59:17 ###############
ams_start_filelog - ok
AMS_JsaDialogCreate: 2048
.............
heapAddr:0x14569e60
heapSize:806940
EventHandler:1027814d
.............
FW@d590dbc 100
----- APP JK_VMEVENT_APPSTARTED callback begin.
AMS: VM_APPLICATION_STATE_CHANGED, 20
----- APP JK_VMEVENT_APPSTARTED callback end.

Assertion failed at: dbgtest.mpsrc:3
demo debug from MIDletPascal

----- APP JK_VMEVENT_APPDESTROYED callback begin.
AMS: VM_APPLICATION_STATE_CHANGED, 23
----- APP JK_VMEVENT_APPDESTROYED callback end.
kvm_main return code = 0
.............
==>>KDWP_SetKdwpOption(): DL_FsDeleteFile error (0x0)
ams_stop_filelog
############### 06/30/2010 12:01:31 ###############


Рассмотрим наиболее распространенный случай отладки программ MIDletPascal, в котором необходимо выявить причину зависания мидлета.

Техника применения:
1. В начале каждой подпрограммы установить вызов assert(false);
2. Запускаем программу в эмуляторе и после зависания открываем лог-файл консоли.
3. Ищем последнюю строку вида "Assertion failed at: dbgtest.mpsrc:3", где узнаем номер строки, а следовательно и название подпрограммы.
4. Ищем везде в исходниках проекта где встречается вызов этой подпрограммы, и добавляем до нее и после нее вызовы assert(false);
5. Запускаем еще раз, опять находим последнюю строку вида "Assertion failed at: dbgtest.mpsrc:3" так становится известен диапазон в исходнике.
6. Теперь добавляем вызовы assert(false) между командами для наиболее точного местоположения ошибки.
7. Для удобства можно добавлять информационные сообщения через debug('...');

arT(c)
[email protected]

cherepets 30.06.2010 14:46

Ответ: Техника отладки программ средствами MIDletPascal
 
я обычно просто выделяю разные части кода в комментарий, чтобы понять из-за каких строк виснет

abcdef 30.06.2010 15:01

Ответ: Техника отладки программ средствами MIDletPascal
 
Исключение кода подходит, если не влияет на работоспособность.
Написал эту статью, т.к. разбирался с чужой программой более чем 2500 строк, которая висла в произвольных местах, как выяснилось из-за нехватки памяти на конструкции drawImage(imageFromImage(loadImage('/image.png'),...
помог принудительный вызов сборщика мусора

Pyth_ON 30.06.2010 16:06

Ответ: Техника отладки программ средствами MIDletPascal
 
Цитата:

Сообщение от abcdef (Сообщение 152226)
Так консольный вывод, помимо сообщений java-машины, удобно применить для диагностических сообщений при работе с эмулятором, на реальном устройстве консольный вывод обычно игнорируют, однако некоторые телефоны имеют опции для перенаправления консольного вывода на какие-либо устройства.
Например меню в "Motorola V3i - Settings - Java Settings - Switching to Debug:" состоит из "Off", "USB", "Modem", "Bluetooth", "File". При выборе пункта "File" создается файл "/a/mobile/kjava/j2me.log" в него дописываются логи консоли, который нужно очищать если размер превысит 1MB иначе java начнет тормозить.

MOTOMAGX'ы кстати дебагают прямо в консоль если запустить jvm из нее, а там можно перенаправить вывод куда угодно :)

cHeRsAnYa 01.07.2010 17:14

Ответ: Техника отладки программ средствами MIDletPascal
 
Цитата:

Сообщение от abcdef (Сообщение 152226)
Java отладка - несколько иная процедура, чем отладка компьютерных программ, т.к. среда не предоставляет средств для трассировки по одной команде, ...

Я бы тут заменил Java на MidletPascal :) Т.к. при написании программ на j2me как раз можно выполнять код по строкам, так же как и при отладке обычных компьютерных программ.

odd 01.07.2010 17:14

Ответ: Техника отладки программ средствами MIDletPascal
 
Я обычно вставляю оператор debug чтобы выяснить в каком месте зависает или вылетает. Неплохо бы написать и про метод "железной" отладки прямо на самом телефоне. Потому что часто бывают специфические глюки, которые проявляются только на определенных моделях телефонов. Отладка программ на Java не представляет особых проблем, там можно выполнять программу построчно с мониторингом состояния любых переменных.

abcdef 03.07.2010 17:42

Ответ: Техника отладки программ средствами MIDletPascal
 
если я что-то не то написал, то кто подскажет как в java среде телефона выполнять чужую программу покомадно с просмотром / изменением произвольных переменных, как в компьютерном дебагере - пусть первым бросит в меня камень. :)
а еще не вижу разницы между компилированой java программой и MIDletPascal, разве что нет обработчика исключений и несколько меньшая функциональность

cHeRsAnYa 05.07.2010 11:26

Ответ: Техника отладки программ средствами MIDletPascal
 
Чужую нельзя так :) Я имел в виду свои программы, когда есть java код. Для этого нужна IDE. Для дебага в эмуляторе особо ничего не надо - он по-умолчанию есть (по крайней мере в NetBeans точно), а для дебага на телефоне - нужно (если телефон SE, про другие не знаю) поставить его SDK и подключить телефон к OnDevice debug.


Часовой пояс GMT +4, время: 23:30.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot