使用XE2远程调试 – 显示字符串

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

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

任何人都可以告诉我为什么这样显示字符串?我也得到相当多的{NULL}和{}之间的垃圾输出变量尚未分配。
谢谢。

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

显示的本地字符串变量:

注意截断的“Hello”。看来XE2有时会出现远程Unicode字符串的问题。我的PaServer是版本1.0.2。任何人都可以检查这是最新的? ‘从更新#4取得的Twas …

解决方法

我不完全确定为什么你有{}围绕字符串值,我的预感是,它是证明值是来自远程执行 – 但我知道一个事实,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的意图。

相关文章

ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:...
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂...
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (By...