58 votes

Débogage à distance avec XE2 - affichage de chaînes

Je suis de débogage à distance un grand app entre DElphi XE2 (mise à jour n ° 4) et un Windows XP cible. PAServer est en cours d'exécution sur la cible et l'application fonctionne très bien et s'arrête à des points d'arrêt (vous ne croiriez PAS comment dur juste que la réalisation était - pointe - de supprimer votre DPROJ et de recommencer si il a été à travers toute IDE avant le XE).

J'ai remarqué que l'affichage des variables locales et des montres de montrer mes chaînes de caractères dans un format étrange par rapport à la traditionnelle exposition de " l'une chaîne de caractères le format que l'on voit lors du débogage localement. Je vois:

enter image description here

Quelqu'un peut me dire pourquoi les chaînes de caractères sont affichés de cette manière? Je reçois aussi un peu de { NULL } et les ordures entre {}'s sur les variables de sortie qui ne sont pas encore affectés. Merci.

. Je vois que ce format indique l'échelle de cordes. J'ai essayé avec une simple application sur Windows 7 et j'ai obtenu le résultat suivant. Mon Application à un point d'arrêt:

enter image description here

L'affichage local des variables de chaîne:

enter image description here

Notez que le tronc de "Bonjour". Il semblerait que XE2 a un problème avec la distance des chaînes unicode à la fois. Mon PaServer est la version 1.0.2. Quelqu'un peut-il vérifier que c'est le dernier? 'Twas prises à partir de la mise à Jour #4...

4voto

LaKraven Points 3815

Je ne suis pas entièrement sûr de savoir pourquoi vous avez le {} autour de la chaîne des valeurs, - mon intuition est que c'est de démontrer que les valeurs sont à venir à partir d'une exécution à distance - mais je sais pour un fait que S est tronqué en raison de l'optimisation...

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

Vous allez maintenant notez que la valeur "Bonjour" (de la variable S) reste intacte lors du débogage. De même, si vous utiliser la valeur attribuée à l' S:

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

Delphi optimisation identifie désormais qu' S est utilisé à l'intérieur de la validité de son champ d'application, et donc la valeur est conservée.

Donc, ce que vous appelez un "bug" est en fait une "fonctionnalité de compilateur", exactement comme Borland/Inprise/Codegear/Embarcadero prévu.

3voto

Darkerstar Points 688

(Je copie le code de @Dave)

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

Je suppose que la variable locale S1 est optimisée car elle n’est utilisée nulle part. La valeur n’est donc plus pertinente.

Essayez d'exécuter ceci sur une machine locale, pouvez-vous voir S1?

1voto

Dave Points 323

Je ne sais pas si cela concerne, mais je suis au courant que System.AnsiStrings contient des commandes spécialisées telles que "Format", etc. ... L'utilisation de l'un des éléments suivants peut résoudre votre problème:

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

Il existe également quelques bogues non résolus, juste pour les exclure. Quelles versions spécifiques du système d'exploitation et des outils utilisez-vous, par exemple Win7 x64 Ultimate, etc.?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X