string - Depuración remota con XE2: visualización de cadenas
delphi debugging (4)
Estoy depurando remotamente una aplicación grande entre DElphi XE2 (actualización # 4) y un objetivo de Windows XP. PAServer se está ejecutando en el destino y la aplicación funciona bien y se detiene en los puntos de interrupción (NO se cree cuán difícil fue ese logro, sugerencia, elimine su DPROJ y comience nuevamente si ha pasado por un IDE anterior a XE).
Observé que la visualización de variables locales y relojes muestra mis cadenas en un formato extraño en comparación con la visualización habitual del formato ''algunas cadenas'' que se ve al depurar localmente. Ya veo:
¿Alguien puede decirme por qué las cuerdas se muestran de esta manera? También obtengo bastante {NULL} y basura entre {} en variables de salida que aún no están asignadas. Gracias.
. Veo que este formato indica cadenas amplias. Intenté una aplicación simple en Windows 7 y obtuve el siguiente resultado. Mi aplicación en un punto de interrupción:
Las variables de cadena locales mostradas:
Tenga en cuenta el ''Hola'' truncado. Parece que XE2 tiene un problema con cadenas de Unicode remotas a veces. Mi PaServer es la versión 1.0.2. ¿Alguien puede verificar que esta sea la última? ''Tomado de la actualización n. ° 4 ...
(Estoy copiando el código de @Dave)
var
S1: AnsiString;
S2: UnicodeString;
begin
S1 := ''Foo'';
S2 := ''Bar'';
ShowMessage(Format(''%s!'', S2));
end;
Supongo que el var var local S1 está optimizado porque no se usa en ninguna parte, por lo que el valor ya no es válido.
Intenta ejecutar esto en una máquina local, ¿puedes ver S1?
No estoy seguro si pertenece, pero conozco System.AnsiStrings que contiene comandos especializados como "Formato", etc ... Usar algo como lo siguiente puede resolver su problema:
var
S1: AnsiString;
S2: UnicodeString;
begin
S1 := ''Foo'';
S2 := ''Bar'';
ShowMessage(Format(''%s!'', S2));
end;
También hay algunos errores abiertos, solo para descartar cualquiera de ellos, ¿qué versiones específicas del sistema operativo y herramientas está utilizando, es decir, Win7 x64 Ultimate, etc.?
Proyecto -> Opciones -> Delphi Compiler -> Linking -> Incluir símbolos remotos de depuración = true
No estoy del todo seguro de por qué tiene el {} alrededor de los valores de cadena, - mi corazonada es que es para demostrar que los valores provienen de una ejecución remota - pero sé con certeza que S
está siendo truncado debido a la optimización ...
{$O-} // Disable Optimization
var
S: AnsiString;
S2: UnicodeString;
begin
S := ''Hello'';
S2 := ''Hello2'';
ShowMessage(S2);
end;
{$O+} // Enable Optimization
Ahora notará que el valor ''Hola'' (de la variable S
) permanece intacto al depurar. Del mismo modo, si utiliza el valor asignado a S
:
var
S: AnsiString;
S2: UnicodeString;
begin
S := ''Hello'';
S2 := ''Hello2'';
ShowMessage(S + S2);
end;
La optimización de Delphi ahora identifica que S
se está utilizando dentro de su alcance válido, por lo que el valor se conserva.
Entonces, lo que usted llama un "error" es, de hecho, una "función de compilación" exactamente como lo pretendía Borland / Inprise / Codegear / Embarcadero.