String 使用XE2进行远程调试-显示字符串

String 使用XE2进行远程调试-显示字符串,string,delphi,debugging,delphi-xe2,remote-debugging,String,Delphi,Debugging,Delphi Xe2,Remote Debugging,我正在DElphi XE2(更新#4)和Windows XP目标之间远程调试一个大型应用程序。PAServer正在目标上运行,应用程序工作正常,并在断点处停止(您不会相信这一成就有多困难-提示-删除您的DPROJ,如果它在XE之前通过了任何IDE,则重新启动) 我注意到,本地变量和手表的显示以一种奇怪的格式显示我的字符串,而在本地调试时通常显示的是“some string”格式。我明白了: 有人能告诉我为什么字符串是这样显示的吗?我还得到了相当多的{NULL}和{}之间的{}垃圾,这些都是尚未

我正在DElphi XE2(更新#4)和Windows XP目标之间远程调试一个大型应用程序。PAServer正在目标上运行,应用程序工作正常,并在断点处停止(您不会相信这一成就有多困难-提示-删除您的DPROJ,如果它在XE之前通过了任何IDE,则重新启动)

我注意到,本地变量和手表的显示以一种奇怪的格式显示我的字符串,而在本地调试时通常显示的是“some string”格式。我明白了:

有人能告诉我为什么字符串是这样显示的吗?我还得到了相当多的{NULL}和{}之间的{}垃圾,这些都是尚未赋值的输出变量。 谢谢

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

显示的本地字符串变量:


请注意截断的“Hello”。似乎XE2有时会遇到远程unicode字符串的问题。我的PaServer是1.0.2版。有人能确认这是最新的吗?”TWA取自更新#4…

我不确定它是否适用,但我知道System.Anistring包含特殊命令,如“Format”等。。。使用类似于以下的方法可以解决您的问题:

var
  S1: AnsiString;
  S2: UnicodeString;
begin
  S1 := 'Foo';
  S2 := 'Bar';
  ShowMessage(Format('%s!', S2));
end;
此外,还有一些公开的bug,只是为了排除其中任何一个,您使用的操作系统和工具的具体版本是什么,例如Win7 x64 Ultimate等

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

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


试着在本地机器上运行这个,你能看到S1吗?

我不完全确定为什么字符串值周围有{},-我的直觉是,这是为了证明值来自远程执行-但我知道一个事实,
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
正在其有效范围内使用,因此保留该值


所以,你所说的“bug”实际上是一个“编译器功能”,与Borland/Inprise/Codegear/Embarcadero的意图完全一致。

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

我猜你遇到了想要登录Quality Central的问题,我怀疑任何终端用户都不能为您解决这个问题。向上投票,因为你有足够的勇气尝试这个。你的远程配置文件是什么样子的?在远程服务器上安装PA时有任何问题吗?远程服务器是否已完全修补并且是最新的?在“局部变量”视图中展开S2时会发生什么情况?@Daisetsu:Remote profile对于另一个IP系统来说是非常基本的。没有其他安装程序问题。我将尝试将变量扩展到内存转储,看看会发生什么。我可以确认PAServer中是否存在此错误。它似乎与Unicode字符串混淆了。如果将字符串更改为ANSI,则可以使用,但这不是解决方案。
var
  S: AnsiString;
  S2: UnicodeString;
begin
  S := 'Hello';
  S2 := 'Hello2';
  ShowMessage(S + S2);
end;