Подтвердить что ты не робот

Удаленная отладка с XE2 - отображение строк

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

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

enter image description here

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

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

enter image description here

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

enter image description here

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

4b9b3361

Ответ 1

Я не совсем уверен, почему у вас есть {} вокруг строковых значений, - я догадываюсь, что он должен продемонстрировать, что значения исходят из удаленного исполнения, - но я знаю, что 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.

Ответ 2

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

Ответ 5

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