58

DElphi XE2 (アップデート #4) と Windows XP ターゲットの間で大規模なアプリをリモート デバッグしています。PAServer はターゲット上で実行されており、アプリケーションは正常に動作し、ブレークポイントで停止します (その成果がどれほど難しいかは信じられないでしょう - ヒント - DPROJ を削除し、XE より前の IDE を使用していた場合は、最初からやり直してください)。

ローカル変数とウォッチの表示では、ローカルでデバッグするときに表示される「何らかの文字列」形式の通常の表示と比較して、文字列が奇妙な形式で表示されることに気付きました。そうですか:

ここに画像の説明を入力

文字列がこのように表示される理由を誰か教えてもらえますか? また、まだ割り当てられていない出力変数の {} の間にかなりの { NULL } とガベージが発生します。ありがとう。

. この形式はワイド文字列を示していることがわかります。Windows 7 で簡単なアプリを試したところ、次の結果が得られました。ブレークポイントでの私のアプリ:

ここに画像の説明を入力

表示されるローカル文字列変数:

ここに画像の説明を入力

切り捨てられた「Hello」に注意してください。XE2 では、リモートの Unicode 文字列に問題がある場合があるようです。私の PaServer はバージョン 1.0.2 です。これが最新であることを誰でも確認できますか?'T は Update #4 から取られたものです...

4

4 に答える 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、有効なスコープ内で使用されていることが識別されるため、値が保持されます。

つまり、「バグ」と呼んでいるのは、実際には、Borland / Inprise / Codegear/Embarcaderoが意図したとおりの「コンパイラ機能」です。

于 2012-09-28T22:27:19.850 に答える
3

(@Dave からコードをコピーしています)

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

ここのローカル変数 S1 はどこでも使用されていないため最適化されていると推測しているため、値はもはや関係ありません。

これをローカル マシンで実行してみてください。S1 が表示されますか?

于 2012-09-25T10:18:43.403 に答える
1

関連するかどうかはわかりませんが、「Format」などの特殊なコマンドを含む System.AnsiStrings を認識しています...次のようなものを使用すると、問題が解決する場合があります。

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

また、未解決のバグがいくつかあります。それらを除外するために、使用している OS とツールの特定のバージョン、つまり Win7 x64 Ultimate などを教えてください。

于 2012-09-23T01:42:21.773 に答える
0

プロジェクト -> オプション -> Delphi コンパイラ -> リンク -> リモート デバッグ シンボルを含める = true

于 2015-08-18T10:36:07.093 に答える