2010-12-09 135 views
3

我是一個很長一段時間的Delphi開發,並在過去我使用第三方工具,記錄和調試,同時開發(稱爲智能檢查),但是現在我已經升級到德爾福XE我想嘗試並使用IDE進行調試。調試代碼

我的問題是,由於像

procedure MyFunction; 
var 
    str : string; 
begin 
    str := 'Foo'; 
    //Debug, show value of str? 
    str := AnotherFunction(str); 
    //Debug, show value of str? 
end; 

我怎麼能調試,並得到str的值,而不做愚蠢的事情像 showmessage(STR)的功能;

如果是在某個地方的視頻(或物品),那麼我很樂意閱讀更多。

有沒有辦法收看/輸出變量的值。

+0

5行,第7行:分配並沒有用過,消除通過優化 – 2010-12-10 10:50:29

回答

7

那麼,Delphi XE自帶CodeSite日誌記錄,但我感覺你在談論調試器本身。

如果你把一個斷點在程序中,它會當它擊中它打破調試器。從那裏,您已經獲得了IDE左側的「局部變量」窗格和「手錶」窗格。局部變量將顯示所有當地人的價值,而Watches可讓您設置其值將追蹤的值。

通過使用Inspect(Alt-F5),您也可以獲得與手錶類似的東西,但具有更詳細的信息(特別是結構化類型,例如對象)。此外,評估/修改(Ctrl-F7)將允許您鍵入表達式並對其進行評估。它不像Inspect那麼細緻,但它給了你更多的靈活性。

如果你熟悉這些工具,你會發現調試要容易得多。

5

1)可以使用的OutputDebugString函數輸出字符串到調試窗口

2)可以使用的CodeSite快車。我推薦使用來自CodeRage 5的視頻作爲使用CodeSite的起點

+0

+1的OutputDebugString – RRUZ 2010-12-09 21:02:47

8

如果你只想使用IDE調試器,然後執行以下操作:

  • 將斷點地方
  • 在breakpointr圈右擊並選擇「斷點屬性...」
  • 按「高級」按鈕,顯示更多選項
  • 取消「破發」複選框
  • 然後使用「日誌信息」和「評估和演示表達」編輯框中輸入跟蹤值

這些消息將被髮送到「事件日誌」窗格中的調試器。右鍵單擊窗格並選擇「屬性」。你可以過濾(「消息」)/ hilight(「顏色」)跟蹤消息。

+1

12年德爾福的,我不知道這一點!有人知道它何時添加? – 2010-12-09 23:15:09

+1

@Gerry:至少Delphi 7。也許5或6;不要再安裝它們來檢查。 – 2010-12-10 00:12:40

0

我更喜歡調試器提示。打破調試器之後,將鼠標移動到代碼中任何位置的「str」,您將看到其當前值。您也可以用鼠標突出顯示某些語句並對其進行評估。例如,突出顯示「AnotherFunction(str)」並將鼠標放在它上面。

1

其他回答都是正確的。

我個人最喜歡的技巧(與da-soft的回答相同)是創建一個斷點,它將一條消息記錄到事件日誌中,其中包含一個我想記錄的值,並且實際上不會「斷開」是,執行繼續,沒有你點擊運行圖標)。然後每次到達這行代碼時,我都會收到我的消息,並在日誌中獲得我的值。既然我可以回去閱讀歷史,以及查看當前值,我發現這比僅使用調試器監視窗口更有用。

但是,由於Delphi XE包含CodeSite,因此您可以遠遠超出斷點處的表達式評估。但是,代碼站點要求您修改代碼以添加一些日誌記錄。但它比消息框好多了。

您也可以使用OutputDebugString(PChar(s))將任何字符串輸出到調試器。由於這可以包含任何你想要的東西,這是一個非常好的調試方式,但不會向最終用戶顯示內容。在我的許多應用程序中,我有一個特殊的跟蹤緩衝區,它是循環的(也就是說,它只保留最後500行左右)。當我看到一個問題時,我不僅會得到一個堆棧回溯,還會保存這個內存中的跟蹤日誌,所以我有一些關於在我的問題之前發生的事情的歷史記錄。

您還可以查看Log 4 Delphi項目。

0

任何其他答案都沒有錯,但我只是想添加這些有用的功能。

procedure DebugString (const s : string) ; overload ; 
begin 
    {$IFDEF DEBUG} 
    OutputDebugString (PChar (s)) ; 
    {$ENDIF} 
end ; 

procedure DebugString (const s : string ; args : array of const) ; overload ; 
begin 
    {$IFDEF DEBUG} 
    OutputDebugString (PChar (Format (s , args))) ; 
    {$ENDIF} 
end ;