Я удаляю большое отладку большого приложения между DElphi XE2 (обновление # 4) и целевым объектом Windows XP. PAServer работает на цели, и приложение работает нормально и останавливается на контрольных точках (вы не поверили бы, насколько сложно было это достижение - подсказка - удалите свой DPROJ и начните снова, если он прошел через любую IDE до XE).
Я заметил, что отображение локальных переменных и часов показывает мои строки в странном формате по сравнению с обычным отображением формата "какой-то строки", который можно увидеть при локальном отладке. Я вижу:
Может ли кто-нибудь сказать мне, почему строки отображаются таким образом? Я также получаю довольно много {NULL} и мусор между {} на выходных переменных, которые еще не назначены. Спасибо.
. Я вижу, что этот формат указывает на широкие строки. Я попробовал простое приложение в Windows 7 и получил следующий результат. Мое приложение в точке останова:
Отображаемые локальные строковые переменные:
Обратите внимание на усеченное "Hello". Казалось бы, XE2 иногда сталкивается с проблемой удаленных строк unicode. My PaServer - версия 1.0.2. Может ли кто-нибудь проверить, что это последнее? 'Twas взяты из Update # 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.
(Я копирую код из @Dave)
var
S1: AnsiString;
S2: UnicodeString;
begin
S1 := 'Foo';
S2 := 'Bar';
ShowMessage(Format('%s!', S2));
end;
Я предполагаю, что локальный var S1 здесь оптимизирован, потому что он нигде не используется, поэтому значение больше не существует.
Попробуйте запустить это на локальном компьютере, вы можете увидеть S1?
Я не уверен, что это имеет значение, но я знаю System.AnsiStrings, содержащий специальные команды, такие как "Формат" и т.д. Используя что-то вроде следующего, вы можете решить свою проблему:
var
S1: AnsiString;
S2: UnicodeString;
begin
S1 := 'Foo';
S2 := 'Bar';
ShowMessage(Format('%s!', S2));
end;
Также есть несколько открытых ошибок, чтобы исключить любые из них, какие конкретные версии os и инструментов вы используете, то есть Win7 x64 Ultimate и т.д.?
Это не особенность - у меня такая же ошибка. Кажется, это путается со строками Unicode. Если вы измените их на ANSI, это будет работать, но это не решение. Не удаляйте мой комментарий - это подтверждает, что это проблема с PAServer!
Проект → Параметры → Компилятор Delphi → Связывание → Включить удаленные символы отладки = true