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

问题描述 投票:57回答:4

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

我注意到局部变量和监视器的显示以一种奇怪的格式显示我的字符串,而在本地调试时通常会显示“某些字符串”格式。我知道了:

任何人都可以告诉我为什么字符串以这种方式显示?我还得到{NULL}和{}之间的垃圾和未分配的输出变量之间的垃圾。谢谢。

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

显示的本地字符串变量:

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

string delphi debugging delphi-xe2 remote-debugging
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正在其有效范围内使用,因此保留了该值。

所以,你所谓的“bug”实际上是一个“编译器功能”,正如Borland / Inprise / Codegear / Embarcadero所预期的那样。


3
投票

(我从@Dave复制代码)

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

我猜这里的局部var S1已经过优化,因为它没有在任何地方使用,所以这个值不再是relvant了。

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


1
投票

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

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.