读书笔记软件调试之道 :问题的核心-重现问题
聲明:本文檔的內(nèi)容主要來源于書籍《軟件調(diào)試修煉之道》作者Paul Butcher,屬于讀書筆記。
重現(xiàn)第一,提問第二
問題重現(xiàn)是實(shí)證過程的最強(qiáng)大武器,如果不能重現(xiàn)問題,你也無法證明修復(fù)了它
首先按照缺陷報(bào)告的描述的步驟來做, 抓住重點(diǎn),包含三個(gè)控制因素
軟件本身:確保你使用的軟件版本和bug提交的版本一致,使用相同的編譯工具和相同的編譯參數(shù)。
軟件運(yùn)行環(huán)境:如果要與外界環(huán)境交互,則確保使用相同外部系統(tǒng)。比如測(cè)距儀,需要在同樣的光照環(huán)境、溫度和供電方式。
提供的輸入:如果軟件代碼的運(yùn)行和配置參數(shù)相關(guān),則應(yīng)該使用相同配置。
?
控制輸入之詳細(xì)說明
軟件的輸入可能時(shí)本地文件,也可能是用戶的一系列操作或者是第三方設(shè)備
推測(cè)可能的輸入:
- 回溯工作:錯(cuò)誤位置明確時(shí),該方法可能可以重現(xiàn)問題,或者提供有效線索
- 探測(cè)可能輸入值:利用邊界值分析法和分支覆蓋法,經(jīng)驗(yàn)表明,這兩處最易出錯(cuò)
- 利用錯(cuò)誤條件:編碼時(shí),人的天性是關(guān)注正常的情況,于是未處理的錯(cuò)誤條件很可能誘發(fā)一系列bug,因此模擬錯(cuò)誤條件可能可以重現(xiàn)問題
- 引入隨機(jī)性:選取一系列不同的輸入值,也叫模糊測(cè)試。該模糊測(cè)試器的關(guān)鍵特征是,可以根據(jù)一些列規(guī)則重新創(chuàng)建曾經(jīng)的輸入,以便能夠隨意重現(xiàn)問題
記錄輸入值:
- 程序日志:在JAVA中有日志功能,可以打開或者關(guān)閉,C語言可以采用獨(dú)立文本
- 外部日志:這個(gè)在客戶端和服務(wù)器端的軟件中采用,獨(dú)立的系統(tǒng)可以忽略
注意負(fù)載和壓力:
- 有些缺陷只有軟件在某種壓力下運(yùn)行是才能表現(xiàn)出來,這個(gè)在服務(wù)器端軟件最明顯,其必須通過壓力測(cè)試;測(cè)距儀軟件需要注意的在電池電量供應(yīng)不足情況下,是否會(huì)運(yùn)行出錯(cuò)!
改進(jìn)問題重現(xiàn)
如何才能讓問題重現(xiàn)即可靠又方便,并且代價(jià)最小?
- 最小化反饋周期:
- 將問題重現(xiàn)最小化:第一次就做到最小化不太可能,需要逐步刪除不必要的方面,縮小問題重現(xiàn)的范圍。
- 最大限度的減少重現(xiàn)所需的時(shí)間:有些bug只是需要時(shí)間來重現(xiàn),因此需要采取措施使其早些發(fā)生,比如懷疑資源泄露,則可以故意營(yíng)造資源耗盡的局面。
將不確定的缺陷變?yōu)榇_定的:
- 軟件之美在于它的確定性,不確定性往往有以下幾個(gè)原因:
- 開始于不可預(yù)知的狀態(tài):比如C/C++程序,使用未初始化的內(nèi)存或變量。
- 與外部系統(tǒng)進(jìn)行交互:這種情況,最好的選擇是使用你能控制的東西代替外部系統(tǒng),比如使用串口助手模擬外設(shè)發(fā)送指令。
- 故意使用隨機(jī)性:軟件中的隨機(jī)函數(shù),都是偽隨機(jī),只要種子一樣,結(jié)果就相同
- 多線程:PC端的軟件叫多線程,嵌入式端一般叫多任務(wù),可以采取措施增加競(jìng)爭(zhēng)情況,是問題更容易實(shí)現(xiàn)
自動(dòng)化:
- 采用自動(dòng)化測(cè)試,不但可以加快進(jìn)程還可以見笑犯錯(cuò)誤的幾率
- 自動(dòng)化測(cè)試:需要構(gòu)建自動(dòng)化測(cè)試框架和用戶借口測(cè)試工具
- 重放日志文件:如果bug重現(xiàn)需要通過日志,則需要通過重放日志構(gòu)造相同的操作序列
迭代:
- 在診斷過程中,隨著獲得軟件運(yùn)行信息越來越多,你可以使用這些信息不斷改進(jìn)你的重現(xiàn)。逐步縮小導(dǎo)致bug發(fā)生的范圍,比如縮小到一個(gè)函數(shù)、一個(gè)變量、一段語句。 通過反復(fù)優(yōu)化確保你的重現(xiàn)問題的程序既方便又可靠!
如果真的不能重現(xiàn)怎么辦?
缺陷真的存在嗎?
- 用戶一般不會(huì)惡意報(bào)告缺陷,極有可能是軟件出錯(cuò)了,也有可能是不清楚為何這樣,誤解了軟件的一些方面。
在相同的區(qū)域解決不同的問題
- 重現(xiàn)問題的區(qū)域還有其它缺陷嗎?如果有,也要一查到底。這樣做可以清理這個(gè)區(qū)域的代碼、使你從整體上更好的了解代碼,并找到重現(xiàn)問題的關(guān)鍵因素。
讓其他人參與其中
- 開發(fā)人員很容易有盲點(diǎn),其工作重點(diǎn)是讓編寫的軟件可以正確運(yùn)行,而不是證明這個(gè)軟件有缺陷,因此讓別人參與進(jìn)來時(shí)必要的。
充分利用用戶群體
- 如果缺陷出現(xiàn)在外部系統(tǒng)中,獲取應(yīng)該讓用戶為你收集重要信息,不過這種方法往往并不理想。
推測(cè)
- 雖然實(shí)證方法是最好的,但是其不是唯一的解決辦法,純邏輯推理就是其中一種。該方法費(fèi)時(shí)費(fèi)力,在其它方法無效時(shí),往往可以起到作用。該方法需要把自己融入到軟件中,執(zhí)行到每一步時(shí),考慮有哪些錯(cuò)誤的可能性,并嘗試解釋你跟蹤的缺陷。
總結(jié)
以上是生活随笔為你收集整理的读书笔记软件调试之道 :问题的核心-重现问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【wxPython 安装指南:error
- 下一篇: 视频分析与多模态融合之一,为什么需要多模