2012-10-14 55 views
6

在Delphi中調試時,例外會正確告訴我導致錯誤的代碼行,但我無法訪問任何本地變量。這是調試器的限制嗎?或者我錯過了一些簡單的東西?目前,我必須在故障發生之前將所有局部變量鏡像到全局線上,重新編譯程序並希望能夠重複相同的異常。德爾福的例外,不讓我看到局部變量

例如

MyArray[I]:=Foo(...); 

如果I是出界(與邊界檢查打開),我不能看到變量I是什麼,除非我把它鏡像到一個全球範圍的調試變量上一行。

或者,如果我有

MyInteger:=Trunc(MyFloat), 

MyFloat6.1E+17,我不知道它的價值。

+0

這是調試器的一個已知限制。沒有什麼可以做的。 –

+0

我是新來的(第一篇文章)。我似乎無法找到「回答問題」,但我看到其他人說「記得標記回答的問題」。我怎麼做? –

+4

我記得,當我遇到這個限制時,Robert,我明確地在引起問題的行上設置了一個斷點(假設問題是可重現的),以便我可以在異常之前訪問局部變量。或者,我用try ...包圍了本地代碼,除了在可以設置斷點的except塊中放置一行外, – RobertFrank

回答

7

當您在調用堆棧窗口中選擇適當的行時,可以看到局部變量的值。在引發異常之前,通常是一行或兩行。

實施此功能時,我手邊沒有準確的版本,但它絕對是新版本之一。

+2

我可以確認D7不能,但是D2007可以在調用堆棧中的相應行上雙擊時在局部變量窗口(不在監視窗口中)顯示值。 –

+0

我通過XE3驗證了這一點。我不明白爲什麼堆棧跟蹤中的每個過程或函數都有兩個堆棧,但其中一個給出的結果非常不準確,但另一個給出了正確的結果。我還沒有嘗試過任何真正的調試(只是故意的例外),但是我假設有99%的時間,很明顯哪一個是正確的。 –

1

就我所知,「問題」是由編譯器引起的。編譯器的優化功能就像一個垃圾回收器,它在不再使用時釋放函數中聲明的變量。

爲了克服這個問題,編寫一個異常處理程序並在異常catch塊中僞造一個變量。