2008-11-19 66 views
7

什麼是你最喜歡的語言的專家調試提示,你認爲每個人都應該使用?例如,我將提供我的C++調試提示,它們之間的調試提示可以幫助我擺脫大部分我遇到的錯誤,這些錯誤通常是難以調試的語言。什麼是最佳調試提示?

C++

  • 增加你的編譯器最大的警告級別,然後停止那些發生了很多的警告,你已經決定了你不關心(對我來說這是未使用的參數) 。 g ++不會警告函數中缺少返回語句(我經常發現一個問題),直到警告級別非常高。

  • 瞭解如何打開編譯器的調試標準庫並使用它! (用於g ++的-D_GLIBCXX_DEBUG)。這會發現很多錯誤,並且還有助於準確顯示錯誤發生的位置。

  • 總是總是通過一個非常好的內存檢查程序來運行你的代碼,如valgrind,並修復它產生的所有問題。

回答

2

幾個我自己的,從大約如果我用它正確地花了幾個晚上調試的東西,編譯或運行時環境可能已經警告我:

  • 如果你正在做什麼用的指針在C++中,在適當的地方assert()它們。事實上,assert()不變式通常是一個好主意,並且可以將調試時間從幾周縮短到幾分鐘。只要記住在發佈版本中關閉它們。哦,不要在那裏放任何有副作用的東西,否則你會在一段時間內調試你的發佈版本。不要問我,我怎麼發現了一個
  • 與此類似,BOOST_STATIC_ASSERT可以在檢查差異,你可以在編譯的時候檢查是非常有幫助的
  • 內存調試像PurifyPlusvalgrind是優秀的節省時間的設備和應該在每個開發人員的機器上
  • 瞭解如何正確使用調試器,以便您可以利用其全部功能,而不是將其用作允許您單步執行代碼的設備
  • 如果您確實卡住,向同事解釋問題和代碼
  • 對於C++來說, FlexeLint/PC-Lint可以幫助您找到很多難以找到的東西,一旦你正確地配置它。您必須投入時間對其進行配置,否則您將陷入警告
  • 如果您正在編寫C++並且正在使用標準容器,請編寫使用迭代器的代碼並讓運行時的調試版本或一個調試STL)捕捉你的錯誤。如果您使用索引引用std :: vector <>中的元素,則必須自己找到這些元素
  • 如果可以,請通過不同的編譯器運行代碼,並且注意它們每個產生的警告。但要確保它們處於類似的語言兼容級別(通過MS VC++ 6運行現代C++代碼沒有意義),否則最終會追查那些並不存在的問題。

理想情況下,你應該嘗試你需要火起來的調試器前發現問題 - 任何你能調整,使得它創建了一個編譯錯誤更容易比跟蹤下來的調試器,然後固定修復它。

1

在您的觀察窗口中始終有「err,hr」。我將顯示調用GetLastError的結果。並且在您逐步完成代碼時動態更新。

5

瞭解不同的幻數意味着VS內存處理程序在處理內存時寫入的內容。

0xCDCDCDCD分配在堆中,但未初始化。由malloc
0xCCCCCCCC分配在堆棧上,但未初始化。
0xDDDDDDDD釋放堆內存。免費
0xFDFDFDFD「NoMansLand」柵欄自動放置在堆內存邊界。不應該被覆蓋。如果你重寫了一個,你可能會走到數組的末尾。
0xFEEEFEEE HeapFree刪除的內存
0xBAADF00D分配在堆中,但未初始化。按HeapAlloc
0xABABABAB不知道。如果有人知道這意味着什麼,請添加。

+0

這是不是特定於某些環境? Google似乎在說Visual Studio。 – philant 2008-11-19 11:34:43

0

不知道這是否算作調試,但對於C和Objective-C代碼,我認爲LLVM/Clang Static Analyzer是非常寶貴的。甚至在您看到它們的效果之前,幫助您發現錯誤,內存泄漏和邏輯錯誤。

1

我調試(PHP)主要由一個除了(需要密碼,IP鎖定)頁的最後一行:

echo '<pre>'; print_r($GLOBALS); echo '</pre>'; 

如果問題是不是在那裏你可以調試「正常」 ,但10次中有9次會跳出來。

0

在Visual C++調試器中,您經常會發現自己處於內聯單行函數,您無法進入並查看其本地(S)。例如:

class foo 
    { 
    int bar() { int i = func1(); int j = func2(i); return j; } 
    }; 

要顯示i的值,您需要一個堆棧幀。但調試器不會進入bar()並向您顯示i的內容。

這裏的技巧是在調試器中啓用內聯彙編。這擴展了功能的處理器指令,這些指令現在不止一行。所以現在你可以進入函數並查詢變量。

或者也許還有另一種方法。 :)

-1

我沒有這方面的參考,但我被告知0xABABABAB地址的意思是'內存超出分配內存的界限'。希望能幫助到你。

0

偶爾會運行您的發佈版本,而不是您的調試版本。一些錯誤只發生在開啓優化時。

相關問題