Remote debugging with XE2 - display of strings

StringDelphiDebuggingDelphi Xe2Remote Debugging

String Problem Overview


I'm remote debugging a large app between DElphi XE2 (update #4) and a Windows XP target. PAServer is running on the target and the application works fine and stops at breakpoints (you would NOT believe how hard just that achievement was - hint - delete your DPROJ and start again if it has been through any IDE prior to XE).

I notice that the display of local variables and watches show my strings in a strange format compared to the usual display of the 'some string' format that one sees when debugging locally. I see:

enter image description here

Can anyone tell me why the strings are displayed this way? I also get quite a bit of { NULL } and garbage between {}'s on output variables that are not yet assigned. Thanks.

. I see that this format indicates wide strings. I tried a simple app on Windows 7 and got the following result. My App at a breakpoint:

enter image description here

The displayed local string variables:

enter image description here

Note the truncated 'Hello'. It would seem that XE2 has a problem with remote unicode strings at times. My PaServer is version 1.0.2. Can anyone check that this is the latest? 'Twas taken from Update #4...

String Solutions


Solution 1 - String

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.

Solution 2 - String

(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?

Solution 3 - String

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.?

Solution 4 - String

Project -> Options -> Delphi Compiler -> Linking -> Include remote debug symbols = true

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBrian FrostView Question on Stackoverflow
Solution 1 - StringLaKravenView Answer on Stackoverflow
Solution 2 - StringDarkerstarView Answer on Stackoverflow
Solution 3 - StringDaveView Answer on Stackoverflow
Solution 4 - StringMesut AltürkView Answer on Stackoverflow