Удаленная отладка с помощью XE2 - отображение строк

59

Я удаляю большое отладку большого приложения между DElphi XE2 (обновление # 4) и целевым объектом Windows XP. PAServer работает на цели, и приложение работает нормально и останавливается на контрольных точках (вы не поверили бы, насколько сложно было это достижение - подсказка - удалите свой DPROJ и начните снова, если он прошел через любую IDE до XE).

Я заметил, что отображение локальных переменных и часов показывает мои строки в странном формате по сравнению с обычным отображением формата "какой-то строки", который можно увидеть при локальном отладке. Я вижу:

Изображение 664

Может ли кто-нибудь сказать мне, почему строки отображаются таким образом? Я также получаю довольно много {NULL} и мусор между {} на выходных переменных, которые еще не назначены. Спасибо.

. Я вижу, что этот формат указывает на широкие строки. Я попробовал простое приложение в Windows 7 и получил следующий результат. Мое приложение в точке останова:

Изображение 665

Отображаемые локальные строковые переменные:

Изображение 666

Обратите внимание на усеченное "Hello". Казалось бы, XE2 иногда сталкивается с проблемой удаленных строк unicode. My PaServer - версия 1.0.2. Может ли кто-нибудь проверить, что это последнее? 'Twas взяты из Update # 4...

  • 7
    Я предполагаю, что вы столкнетесь с чем-то, что вы захотите войти в Quality Central, и сомневаюсь, что любой простой конечный пользователь сможет это исправить для вас. Голосовали за то, что достаточно смелы, чтобы попробовать это.
  • 0
    Как выглядит ваш удаленный профиль? Были ли у вас проблемы с установкой PA на удаленном сервере? Удаленный сервер полностью исправлен и обновлен? Что происходит, когда вы расширяете S2 в представлении локальных переменных?
Показать ещё 2 комментария
Теги:
string
debugging
delphi-xe2
remote-debugging

5 ответов

4

Я не совсем уверен, почему у вас есть {} вокруг строковых значений, - я догадываюсь, что он должен продемонстрировать, что значения исходят из удаленного исполнения, - но я знаю, что S будучи усеченным из-за оптимизации...

{$O-} // Disable Optimization
var
  S: AnsiString;
  S2: UnicodeString;
begin
  S := 'Hello';
  S2 := 'Hello2';
  ShowMessage(S2);
end;
{$O+} // Enable Optimization

Теперь вы заметите, что значение "Hello" (переменной S) остается неизменным при отладке. Аналогично, если вы используете значение, присвоенное S:

var
  S: AnsiString;
  S2: UnicodeString;
begin
  S := 'Hello';
  S2 := 'Hello2';
  ShowMessage(S + S2);
end;

Оптимизация Delphi теперь определяет, что S используется в пределах допустимой области действия, и поэтому значение сохраняется.

Итак, то, что вы называете "ошибкой", на самом деле является "функцией компилятора" точно так же, как и для Borland/Inprise/Codegear/Embarcadero.

3

(Я копирую код из @Dave)

var
  S1: AnsiString;
  S2: UnicodeString;
begin
  S1 := 'Foo';
  S2 := 'Bar';
  ShowMessage(Format('%s!', S2));
end;

Я предполагаю, что локальный var S1 здесь оптимизирован, потому что он нигде не используется, поэтому значение больше не существует.

Попробуйте запустить это на локальном компьютере, вы можете увидеть S1?

1

Я не уверен, что это имеет значение, но я знаю System.AnsiStrings, содержащий специальные команды, такие как "Формат" и т.д. Используя что-то вроде следующего, вы можете решить свою проблему:

var
  S1: AnsiString;
  S2: UnicodeString;
begin
  S1 := 'Foo';
  S2 := 'Bar';
  ShowMessage(Format('%s!', S2));
end;

Также есть несколько открытых ошибок, чтобы исключить любые из них, какие конкретные версии os и инструментов вы используете, то есть Win7 x64 Ultimate и т.д.?

0

Это не особенность - у меня такая же ошибка. Кажется, это путается со строками Unicode. Если вы измените их на ANSI, это будет работать, но это не решение. Не удаляйте мой комментарий - это подтверждает, что это проблема с PAServer!

0

Проект → Параметры → Компилятор Delphi → Связывание → Включить удаленные символы отладки = true

Ещё вопросы

Сообщество Overcoder
Наверх
Меню