Remote debugging with XE2 - display of strings

I'm not entirely sure why you have the {} around the string values, - my hunch is that it is to demonstrate that the values are coming from a remote execution - but I know for a fact that S is being truncated due to optimization...

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

You'll now note that the value 'Hello' (of variable S) remains intact when debugging. Likewise if you make use of the value assigned to S:

var
  S: AnsiString;
  S2: UnicodeString;
begin
  S := 'Hello';
  S2 := 'Hello2';
  ShowMessage(S + S2);
end;

Delphi's optimization now identifies that S is being used within its valid scope, and so the value is preserved.

So, what you're calling a "bug" is in fact a "compiler feature" exactly as Borland/Inprise/Codegear/Embarcadero intended.


(I am copying code from @Dave)

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

I am guessing local var S1 here is optimized because it is not used anywhere, so the value is not relvant anymore.

Try run this on a local machine, can you see S1?


I am not sure if it pertains, but I am aware of System.AnsiStrings containing specialized commands such as "Format", etc... Using something like the following may resolve your issue:

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

Also there are a few open bugs, just to rule out any of those, what specific versions of the os and tools are you using i.e. Win7 x64 Ultimate etc.?