58

我正在远程调试 DElphi XE2(更新 #4)和 Windows XP 目标之间的大型应用程序。PAServer 正在目标上运行,应用程序运行良好并在断点处停止(您不会相信该成就有多难 - 提示 - 如果它已通过 XE 之前的任何 IDE,请删除您的 DPROJ 并重新开始)。

我注意到,与本地调试时看到的“某些字符串”格式的通常显示相比,局部变量和手表的显示以一种奇怪的格式显示我的字符串。我懂了:

在此处输入图像描述

谁能告诉我为什么字符串会这样显示?在尚未分配的输出变量上,我还得到了相当多的 { NULL } 和 {} 之间的垃圾。谢谢。

. 我看到这种格式表示宽字符串。我在 Windows 7 上尝试了一个简单的应用程序,得到了以下结果。我的应用程序处于断点:

在此处输入图像描述

显示的本地字符串变量:

在此处输入图像描述

请注意截断的“Hello”。XE2 似乎有时会遇到远程 unicode 字符串的问题。我的 PaServer 是 1.0.2 版。任何人都可以检查这是最新的吗?'Twas from Update #4...

4

4 回答 4

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 所期望的那样。

于 2012-09-28T22:27:19.850 回答
3

(我正在从@Dave 复制代码)

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

我猜这里的本地 var S1 是优化的,因为它没有在任何地方使用,所以该值不再相关。

尝试在本地机器上运行它,你能看到 S1 吗?

于 2012-09-25T10:18:43.403 回答
1

我不确定它是否相关,但我知道 System.AnsiStrings 包含专门的命令,如“格式”等......使用类似以下的内容可能会解决您的问题:

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

还有一些开放的错误,只是为了排除其中任何一个,您使用的是哪些特定版本的操作系统和工具,即 Win7 x64 Ultimate 等?

于 2012-09-23T01:42:21.773 回答
0

项目 -> 选项 -> Delphi 编译器 -> 链接 -> 包括远程调试符号 = true

于 2015-08-18T10:36:07.093 回答