軟體除錯實戰

2021-05-27 13:57:04 字數 1581 閱讀 6137

系統性除錯方法

理解需求

製造失敗

簡化測試用例:目的:排除不起作用的因素 ;減少測試用例的執行時間;最重要的是,使測試用例更容易除錯。

讀取恰當的錯誤資訊:重點關注首先出現的那些訊息。

檢查顯而易見的問題

從解釋和中分離出事實

分而治之:整理乙份清單,列出潛在問題以及如何除錯它們(除錯歸根到底是一種試錯法trial-and-error);將環境更改和源**更改區分開(跟蹤環境的更改,撤銷源**的更改);放大並治之(記憶體除錯,常規的源**除錯,同步除錯)

工具要與bug匹配:要除錯的是出現問題的地方,而不是便於除錯的地方;關注那些最有可能找到bug的方面。

一次只做一項更改:在偵錯程式期間為修改的源**加注釋指明修改的型別和原因是乙個好習慣;除錯時盡量一次解決乙個問題。

保持審計跟蹤:進行手工測試時,要記下做了哪些事情,執行的順序以及出現了什麼結果;讓程式建立日誌檔案並輸出狀態訊息。

獲得全新觀點:當陷入僵局是,可以找別人討論一下。

bug不會自己修復:除非有很充分的理由說明修復很有效,否則最好假設bug依然存在,並且未來還會發作。

用回歸測試(regression test)來檢查bug修復。

源**偵錯程式,記憶體偵錯程式,剖析工具

當更換編譯器版本時,應檢查整個除錯工具套件是否依然工作。

在整個系統可執行之前開發單元測試,可以提高軟體的可觀察性和可控制性。

單元測試:黑盒:主要驗證元件的預期功能,而忽略其實際的實現,具有很好的移植性;白盒:主要測試實現的邊界情況以及一些「弄巧成拙的錯誤」。

常見bug:行為是可以**的。

偶發性bug:很難定位,找到乙個測試用例,可以再現這些bug。可在程式中加入「看門狗」**捕捉。

heisenbug:原因:資源爭用(共性:未定義執行順序);非法使用記憶體(如讀取未初始化的變數,野指標,陣列越界);優化錯誤(編譯器優化時常出現bug,有時需要關閉優化來除錯)。

隱藏在bug背後的bug:某些情況下,為了避免程式行為的異常,需要修復多個問題。(需要違反「一次只做一項更改」規則)

秘密bug--除錯和機密性(客戶無法傳送測試用例給我們,我們無法傳送有源**的除錯版本給客戶):辦法:自己嘗試再現相同的bug;現場除錯;使用安全的連線(遠端除錯,客戶計算機執行可除錯的軟體,但源**在除錯者的計算機上)。

查詢根源---源**偵錯程式

大多數編譯器優化在除錯模式下是禁止的,因此程式會執行較慢。

c/c++程式的棧是乙個記憶體片段,用來儲存每個活動的函式呼叫的stack frame,stack frame由返回位址,函式的引數和區域性變數組成。

修復記憶體問題

記憶體洩漏:在執行時分配但在程式不再需要它時未釋放的資料結構。常規偵錯程式很難找到,沒有明顯的錯誤語句,而是丟失或者忘記呼叫某條語句。

記憶體管理的錯誤使用:如多次釋放乙個記憶體塊,釋放乙個記憶體塊之後又訪問它,釋放乙個從未分配的記憶體塊,使用delete而不是delete來釋放陣列,malloc和delete混用,new和free混用。

緩衝區溢位:在已分配記憶體的外部的記憶體被改寫或破壞。導致記憶體破壞的語句與觸發可見bug的語句之間沒有明確的關係。

未初始化的記憶體bug:未初始化的變數將包含無法預料的值。

軟體除錯實戰 13條黃金除錯規則

軟體除錯實戰 1 13條 除錯規則 1.1 1 理解需求 1.1.1 保證理解需求,以確認是否是bug 1.2 2製造失敗 1.2.1 需要乙個測試用例是程式執行失敗 1.2.2 用該測試用例來回歸bug測試 1.3 3 簡化測試用例 1.3.1 排除不起作用的因素 1.3.2 減少測試用例的時間 ...

軟體除錯 Debug

軟體除錯是在進行了成功的測試之後才開始的工作。它與軟體測試不同,除錯的任務是進一步診斷和改正程式中潛在的錯誤。除錯的主要任務有兩項 一項是確定程式中錯誤的確切性質和位置,二是對程式進行修改 排除錯誤。除錯的步驟如下 1 從錯誤的外部表現形式入手,確定程式中出錯位置 2 藥酒有關部分的程式,找出錯誤的...

遠端除錯軟體

專案開發中總會碰見現場軟體有問題,需要除錯。但有時候現場伺服器不允許安裝vs工具,或是不方便把源 放到現場的伺服器上,或是需要使用現場的某些裝置,導致無法使用現場的環境進行遠端除錯,公司環境又無法完全模擬現場環境。故想開發一款遠端除錯 軟體,能通過某台外網伺服器做中轉,實現遠端除錯。圖1 常規遠端除...