2012-07-24 77 views
57

我正在遠程調試DElphi XE2(更新#4)和Windows XP目標之間的大型應用程序。 PAServer運行在目標上,應用程序正常運行並停在斷點處(你不會相信這個成就有多難 - 暗示 - 刪除你的DPROJ,如果它已經通過XE之前的任何IDE,則重新開始)。使用XE2進行遠程調試 - 顯示字符串

我注意到,局部變量和手錶的顯示與我在本地調試時看到的'some string'格式的常見顯示相比,以奇怪的格式顯示我的字符串。我看到:

enter image description here

誰能告訴我,爲什麼字符串顯示這種方式?對於尚未分配的輸出變量,{}之間的{}}也會有相當多的{NULL}和垃圾。 謝謝。

。我看到這種格式表示寬字符串。我在Windows 7上嘗試了一個簡單的應用程序,並得到了以下結果。我的應用程序在一個斷點:

enter image description here

顯示的局部字符串變量:

enter image description here

注意截斷 '你好'。看起來XE2有時在遠程unicode字符串上有問題。我的PaServer是版本1.0.2。任何人都可以檢查這是最新的嗎? 'Twas採取從更新#4 ...

+7

我猜你正在運行到的東西,你會要登錄中央品質,我懷疑任何僅僅最終用戶可以爲你解決這個問題。 Upvoted勇於嘗試這一點。 – 2012-07-24 19:38:44

+0

您的遠程配置文件是什麼樣子的?在遠程服務器上安裝PA時是否有任何問題?遠程服務器是否已完整修補並保持最新狀態?在局部變量視圖中展開S2時會發生什麼? – Daisetsu 2012-08-30 22:49:04

+0

@Daisetsu:遠程配置文件對於另一個IP系統非常基礎。沒有其他安裝程序問題。我會嘗試將該變量擴展到內存轉儲並查看會發生什麼。 – 2012-09-01 07:18:40

回答

1

我不知道它是否屬於,但我知道System.AnsiStrings包含專門的命令,如「格式」等...使用類似下面的東西可能會解決您的問題:

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

也有一些開放的錯誤,只是爲了排除任何這些,你用什麼具體的操作系統版本和工具,即Win7的X64旗艦版等?

+0

有趣,生病請看看。謝謝。 – 2012-09-24 05:44:41

3

(我從@戴夫複製代碼)

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

我猜這裏局部變量S1進行了優化,因爲它沒有任何地方使用,因此該值不再relvant。

試試在本地機器上運行這個,你能看到S1嗎?

4

我不完全確定你爲什麼在字符串值附近有{},我的直覺是它證明這些值來自遠程執行 - 但我知道S正在由於優化截斷......

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

現在你會注意到,在調試時的值「你好」(可變S的)保持不變。同樣,如果你使用分配給S值:

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

德爾福的優化現在識別S被其有效範圍內使用,並因此該值將被保留。

所以,你所說的「bug」實際上就是Borland/Inprise/Codegear/Embarcadero打算的「編譯器特性」。

0

項目 - >選項 - > Delphi編譯器 - >鏈接 - >包括遠程調試符號=真