最近兩個月遇到了兩個特別棘手的bug,有一些共同點:
基本都用了2-3天才解決,算是遇到的比較難解的bug,這裡記錄一下。
看看能否除錯:因為是release包,先找一下有沒有可能連著xcode除錯release包(嘗試了各種辦法,比如通過打adhoc包,然後attach process,最終均以失敗告終),但是這個肯定是正常思維要考慮的方法,並且bug2只能通過走這條路去發現問題,稍後詳細說明。
定義評判標準:不能除錯,只能通過打包驗證的方法,並且概率性出現的bug。那麼必須先找到bug出現的規律,否則之後沒有辦法判斷乙個包是否有問題(如果乙個包用了一會沒有問題,你也不能自信的說bug已經解決了)。通過對於有問題的包的大量使用,發現在某個頁面來回的切換前後臺最有可能復現bug,基本每次切換3-4次就會卡死。那麼我們就有了乙個問題解決的標準:如果在這個頁面來回切換前後臺10幾次都沒有問題,就可以認為bug已經解決,可以給測試同學再全面的驗證一下。
盡量縮小目標:每次打包時間至少10分鐘,打包的代價是很高的,每次修改的**一定最好要能體現問題,最開始,我對於最可疑的**進行修改,然後打包。可惜不是這些**的問題。但是這步肯定是必要的。
地毯式搜尋解決問題:此時我們處於茫然階段,完全不知道是什麼**導致的。但是我們知道什麼上一次線上版本是好的。目前也沒有別的辦法了,開啟source tree,匯出從上次發版,到這次發版所有的git commit,大概有400多個,就是這400多個commit中的某個commit導致這個bug,我們當時不是乙個乙個commit打400個包去驗證。通過二分法,先看200有沒有問題,如果有,那麼則關注100,如果沒有則關注300,這樣很快就可以定位有問題的commit,其實只需要打9-10個包就可以找到存在問題的commit了。2的9次方是500,就可以定位了。每次打包驗證的時間差不多15分鐘,這樣,最後花了幾小時時間找到了有問題的commit。
上面描述的解決過程,導致bug的原因其實在fmdb資料的某個方法加了乙個bool的方法值,就出現了這個問題,比較重要的解決問題的方法,至於為什麼增加了乙個返回值,就在release包下不定時卡死,這個問題本想找時間看看,沒想到很快遇到了bug2。也正好解答了bug1剩餘的這個問題。
表現是ios11下,使用某個功能特別容易卡死。下面是解決的過程:
沒有考慮是否能否除錯release包,因為之前已經嘗試過很多次失敗了
定義評判標準:通過大量使用,確定了一種使用過程必將導致問題的出現。
對於最可疑地方進行修改,重新打包,驗證依然不行
想看下從哪個版本開始有點問題:結果發現一年前的包,在ios11上依然會有問題。所以也沒法地毯式解決問題了。
差不多絕望的時候,把中心轉向了步驟1,因為遇到的這個問題,不能除錯完全沒有頭緒是哪齣的問題。所以花了很多的時間查詢如何除錯release。最後依然沒有成功,所以目前認為release包是無法除錯的。但是換個角度考慮問題:是什麼導致的debug和release包的行為不同呢,最後找到了一篇文章提到xcode的乙個編譯選項:optimization level,這個是build debug包和release包時優化的等級,一共分6個等級,越高等級優化的約多,**效率越高,包越小。對於寫的不合理的**,高等級的優化也會導致一些未知的問題。debug一般選擇的是最低的level,release選擇的一般是第二高的level。當時想能否把release的優化等級改為debug一樣的等級,然後打出來包,能通過xcode attach process上除錯,但是依然不行,哈哈,但是竟然發現,這樣打出來的包,就沒有問題了,所以判斷是這個編譯設定導致的問題。再反轉下思路,那麼我把debug的等級調高成和release的一樣,是不是就會出現問題呢,調整之後,果然debug包也出現了問題,並且可以除錯了!!之後找到問題就很快了。
其實是對於sql的引數需要傳4個,但是我們傳了3個,第4個沒有用當時就沒傳,之前一直沒有問題,也就沒有發現。但是ios11之後,肯定調整了不同的optimization level下的優化策略,開始出現了這個問題。同樣bug1只在release包有問題,也是這個原因。
如果只在release包下出問題,看看調整optimization level之後,debug下能否出問題,如果問了問題,就可以除錯了,如果沒問題,就只能參考上面其他的方法,打包驗證。
**還是要規範寫好,debug沒問題不代表release沒問題,今天沒問題也不代表以後沒問題。
交給測試的還是要多測測release包,或者修改下optimization level,試試debug包。
ajax中出現兩次請求
在專案中發現ajax中出現兩次請求,options請求和get請求,得到的資料出錯,所以想要去掉options請求。ajax請求如下 ajaxrequestget function lastpath,requestparams,successfun url this.baseurl lastpath...
陣列中兩個數出現一次其餘出現兩次
有兩個數a b分別出現一次 其餘出現兩次 只要能找到乙個劃分乙個包含a 乙個包含b 對兩個分別使用找出出現一次的演算法 class solution public vectorsinglenumber vector nums int axorb 0 for int num nums axorb nu...
TOMCAT載入兩次war包(重複載入)
一 問題描述 專案中通過配置context節點docbase,使docbase指向專案的絕對路徑,可以直接通過ip加埠訪問,今日發現意外bug,專案中某個功能奇數次執行成功,偶數次執行失敗。二 問題排查 這種現象應該是兩次使用的為不同的物件,通過debug確認問題。但是本來是單例模式實現的例項,呼叫...