Проблемы с отладкой,... Кирилица в строковых переменных

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблемы с отладкой,... Кирилица в строковых переменных

Сообщение Andreich » 10.09.2008 09:45:42

Имееется простейший пример:

Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var a, b : string;
begin
  a:='строка 1';
  b:='string 1';
  ShowMessage(a+' '+b);
end;


Так вот,.. Вывод ShowMessage работает совершенно корректно, а в отладочном окошке Local variables строчка a отображестся набором кодов символов типа: 0x8273208 #209#129#209#130#209#128#208#190 .... и т.д.

В чем проблема? Lazarus 0.9.25 betta (20080823).
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Проблемы с отладкой,... Кирилица в строковых переменн

Сообщение alexs » 10.09.2008 12:07:29

gdb не умеет отображать кирилицу - поэтому так получается.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Проблемы с отладкой,... Кирилица в строковых переменн

Сообщение Andreich » 10.09.2008 12:21:15

alexs писал(а):gdb не умеет отображать кирилицу - поэтому так получается.


И что же делать? :(
Существуют ли другие отладчики, которые можно использовать вместе с Lazarus?
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Проблемы с отладкой,... Кирилица в строковых переменн

Сообщение alexs » 10.09.2008 12:38:58

А это настолько критично?
используй промежуточное логирование в файл - очень способствует :-)
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Проблемы с отладкой,... Кирилица в строковых переменн

Сообщение Andreich » 10.09.2008 12:51:19

При работе с большими массивами (особенно динамическими) это не совсем удобно.
Хотя, если других вариантов нет, придется поступать именно так!
Andreich
постоялец
 
Сообщения: 268
Зарегистрирован: 17.04.2008 12:33:43

Re: Проблемы с отладкой,... Кирилица в строковых переменн

Сообщение alexs » 10.09.2008 13:34:50

на мой взгляд - как раз при обработки больших массивов (при большом числе итераций) пошаговая трассировка - не самое лучшее решение. Я тут обычно пользуюсь логами. А вот после локализации ошибки - пишу в коде код для остановке на нужной итерации - и тут уже трассировка.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Проблемы с отладкой,... Кирилица в строковых переменн

Сообщение fflatx » 30.09.2008 14:40:37

alexs писал(а):Я тут обычно пользуюсь логами. А вот после локализации ошибки - пишу в коде код для остановке на нужной итерации - и тут уже трассировка.

+10

Я тоже столкнулся с этой проблемой. Архангельский А.Я. в своей книге по Дельфи описывает некотоые способы встраивания отладки в код. Я по его примеру попробовал сделать в Лазарусе.
При событии создания главной формы в коде создается еще одна форма и на ней создается отладочное окно (Tmemo). В это окно выводятся значения нужных переменных в процессе выполнения, причем тут уже можно со своими комментариями на русском, как угодно подробно - в общем полная свобода творчества. Получилось неплохо.
Чтобы эти отладочные операторы не попали в готовый файл, используем директивы условной компиляции.
А можно эти операторы оставить, они могут пригодится в дальнейшем.
Вывод окна отладки можно связать с наличием файла Debug.txt в папке с программой. Если файл найден - работает отладочное окно. Удаляем файл - окно не появляется. Таким образом, можно получить отладочную информацию даже при скомпилированном работающем приложении на машине, где нет Лазаруса/Дельфи.
fflatx
незнакомец
 
Сообщения: 5
Зарегистрирован: 27.09.2008 01:14:24

Re: Проблемы с отладкой,... Кирилица в строковых переменн

Сообщение alexs » 30.09.2008 16:45:20

я просто пишу лог файл в домашний каталог оператора - и всё.
Причём в лог пишутся все сообщения об ошибках (есть централизованная процедура обработки исключений)
сама процедура - до примитива просат: открыл текстовый файл, кинул строку, закрыл текстовый файл.
Ещё иногда в эту процедура записи лога вставляю переменную, определяющую - нужно ли писать лог или нет. В таком лучае эта переменная включается через параметр командной строки.
Но чаще всего - лог пишется всегда.
В дальнейшем просто это удобно для того, чтобы отследить, что происходило у оператора.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Проблемы с отладкой,... Кирилица в строковых переменн

Сообщение fflatx » 30.09.2008 20:00:29

alexs писал(а):есть централизованная процедура обработки исключений

Об этом можно поподробнее? Я в свое время в Дельфи думал над этим, но централизованно сделать так и не удалось.

Конструкция обрабатывает исключения в определенном месте кода:
Код: Выделить всё
try
...  //участок защищенного кода
except
... // onException1
... // onException2
else
... // onExceptionN
finally
...
end;

Проблема в том что, одни и те же ошибки потенциально могут возникнуть в разных местах. И тогда

Код: Выделить всё
except
... // onException1
... // onException2

повторяется много раз практически без изменений, поскольку одну и ту же ошибку, мы везде обрабатываем одинаково (например, выводим сообщение об ошибке для пользователя на русском языке). Я думал о том, как можно создать единую процедуру обработки исключений, в которую передавались бы все исключительные ситуации, и уже в этой процедуре их можно было обрабатывать. Как выяснилось, сделать это, в общем случае, невозможно, точнее сделать-то можно, но это нисколько не проще и не экономичней стандартной конструкции. Так что, если у Вас реализована централизованная процедура обработки исключений - это достаточно интересно. :D
fflatx
незнакомец
 
Сообщения: 5
Зарегистрирован: 27.09.2008 01:14:24

Re: Проблемы с отладкой,... Кирилица в строковых переменн

Сообщение alexs » 01.10.2008 09:38:05

ну обёртку try-except-end я пишу в любом случае по месту - т.е. в тех местах, которые потенциально опаснны. Но вот в блок
except-end
у меня всегда выглядит так:
Код: Выделить всё
    except
      on E:Exception do
        ErrorBoxAndRolback(E);
    end;

это для тех мест, где работает пишушая транзакция БД.
а уже процедуру ErrorBoxAndRolback расписываю в зависимости от нужд проекта.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 58

Рейтинг@Mail.ru