c 除錯技巧

2021-07-11 13:56:55 字數 1381 閱讀 2577

看書的時候,結合自己不足一年的程式設計經驗,寫出來的乙個還算是比較基礎的c++除錯經驗的總結。

1、重現bug

要重現bug,首先採用與bug第一次出現時完全相同的輸入。注意不要只執行觸發操作,因為bug 可能是由整個操作序列產生的。

當能一致地重現這個bug時,應嘗試找出觸發這個bug的最小序列**,可以從僅包含觸發操作的最小序列開始,然後慢慢擴大至覆蓋啟動時的完整序列**,直到bug被觸發時。–> 這會得到重現這個bug的最簡單高效的測試用例。

2、調可重複的bug

目標是找到觸發這個問題的準確的**行。

1)記錄除錯資訊,通過觀察除錯資訊來判斷bug出現的地點。不過若手邊有乙個現成的偵錯程式,不建議加上除錯資訊,因為除錯資訊的修改與還原比較麻煩

2)直接使用偵錯程式來進行除錯,附上gdb的除錯的一篇轉文。(此處已經預設讀者可以熟練使用偵錯程式的基本操作)

3、調不可重複的bug

這種bug的除錯非常困難,因為很難重現bug出現時的情景(只能使用自己的經驗進行大膽的猜測)。。。所以除錯這種bug,手邊沒有什麼特別厲害的除錯工具時,只能夠通過檢查**來發現問題,不過有趣的時,這種方法時時也竟會比較有效。因為我們帶著剛才發生bug的視角再來重新審視一遍**時,往往會有很大可能發現出問題所在。

不過,我們在這裡並不建議長時間盯著**看而是手工跟蹤**的執行路徑

4、除錯記憶體問題。

不要解除對nullptr指標的引用。

一般的記憶體錯誤的檢查:

1)確保每乙個new的呼叫都匹配了乙個delete的呼叫。同樣,每乙個對malloc、alloc和calloc的呼叫都要匹配乙個對free的呼叫。每乙個new的呼叫也要匹配乙個對delete的呼叫。為了避免雙重釋放記憶體或使用已釋放的記憶體,建議釋放記憶體後將指標設定為空

2)檢查緩衝區的溢位,每次迭代訪問乙個陣列或者讀寫乙個c風格的字串的時候,驗證沒有越過陣列尾部訪問的記憶體。通過使用stl容器和字串通常可以避免此類問題

3)檢查無效指標的解除引用

4)在堆疊上宣告指標的時候,一定要確保在宣告中初始化指標,如:

t* p = nullptr;

//或 t* p = new t;

//不要 t* p;

5)同樣,確保總是在類的建構函式中初始化指標資料成員,既可以在建構函式中分配記憶體也可以將指標設定為nullptr。

(ps:記憶體錯誤並不總是會立刻出現,它有可能是程式中各個**段綜合作用的結果,往往需要偵錯程式和一點耐心才可以。)

C 除錯技巧

在c 中有時會用到類似於標頭檔案保護的技術,以便有選擇的執行除錯 基本思想是,程式可以包含一些用於除錯的 但是這些 只在開發程式的時候使用。當應用程式編寫完成準備發布時,要先遮蔽掉除錯 這種方法用到了兩種預處理功能 assert和ndebug。assert預處理巨集 assert是一種預處理巨集。所...

c 除錯技巧

大家都知道,打斷點是最為大家所熟知的除錯技巧,但是除了打斷點,還有哪些除錯的技巧呢?system.diagnostics 這個命令空間裡有很多可供除錯的類庫。diagnostics這個單詞的意思是診斷,在軟體的世界裡就是診斷程式存在的問題,即除錯。下面為大家介紹這個類庫里幾個非常實用的方法,這幾個方...

C 除錯技巧總結

1 條件中斷 for inti 0 i 100 i 第一種方法 執行輸出要i等於50,當開始執行for迴圈時,直接將i的值改為49,然後在執行。第二種方法 對if i 50 斷點執行進行條件設定為 i 50,然後按f5直接到條件i為50,則進入輸出語句 或者設定命中次數,選擇中斷,條件命中次數等於4...