XE2远程调试 - 字符串的显示

58

我正在对一个大型应用程序进行远程调试,使用的是Delphi XE2(更新#4)和一个运行Windows XP的目标系统。PAServer在目标系统上运行良好,并且应用程序可以正常工作并在断点处停止(如果遇到问题,请删除DPROJ并重新开始,如果它曾经通过任何IDE之前的XE)。

我注意到本地变量和监视器的显示以一种奇怪的格式显示我的字符串,与本地调试时通常显示的“some string”的格式不同。如下图:

enter image description here

有人能告诉我为什么会以这种方式显示字符串吗?我还发现,在未分配输出变量上输出的{ NULL }和花括号之间有很多垃圾。

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

enter image description here

显示的本地字符串变量:

enter image description here

请注意被截断的“Hello”。似乎XE2有时无法处理远程Unicode字符串。我的PaServer版本是1.0.2,可以有人检查一下这是否是最新版本?它是从更新#4中获取的...


7
我猜你可能遇到了一些需要在Quality Central上记录的问题,而且我怀疑仅靠普通的终端用户无法为你修复此问题。点赞是因为你足够勇敢尝试解决这个问题。 - Warren P
你的远程配置文件是什么样子?在远程服务器上安装PA时有遇到任何问题吗?远程服务器是否已完全打补丁并更新?当您在本地变量视图中展开S2时会发生什么? - Daisetsu
@Daisetsu:远程配置文件对另一个IP系统非常基本。没有其他安装程序问题。我将尝试将变量扩展到内存转储并查看发生了什么。 - Brian Frost
我可以确认PAServer中存在这个bug。它似乎会对Unicode字符串感到困惑。如果你将字符串更改为ANSI,它就能工作了,但这不是一个解决方案。 - JJD2K
4个回答

4

我不完全确定你为什么要在字符串值周围加上 {},我的猜测是为了证明这些值来自远程执行,但我知道,S由于优化而被截断...

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

现在您会注意到,在调试时变量S的值'Hello'保持不变。同样,如果您使用分配给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;

我猜测这里的本地变量S1被优化了,因为它没有被任何地方使用,所以它的值不再相关。

在本地机器上运行一下,你能看到S1吗?


1

我不确定是否适用,但我知道System.AnsiStrings包含特殊命令,如“Format”等...使用类似以下的内容可能会解决您的问题:

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

此外,还有一些未解决的漏洞,为了排除这些问题,请问您使用的操作系统和工具的具体版本是什么,例如Win7 x64 Ultimate等?


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接