合理的製造bug,及查詢bug

2021-07-10 17:35:16 字數 1517 閱讀 2487

一、合理的製造crash bug

什麼是bug,簡單點說就是,程式沒有按照我們預想的方式執行。我比較喜歡把

bug分成兩類:

crash

不可怕,可怕的是程式沒有

crash

而是執行在乙個不穩定的狀態下,如果程式還操作了資料,那帶來的危害將是災難性的,因此盡量製造

crash

的bug

,減少沒有

crash

的bug

,盡可能將沒有

crash

掉的bug

轉換成crash

的bug。

nsassert

可以將沒有crash掉的bug盡可能的轉換為crash的bug,他的名字叫做「斷言

」。斷言(

assertion

)是指在開發期間使用的、讓程式在執行時進行自檢的**(通常是乙個子程式或巨集)。斷言為真,則表明程式執行正常,而斷言為假,則意味著它已經在**中發現了意料之外的錯誤。斷言對於大型的複雜程式或可靠性要求極高的程式來說尤其有用。而當斷言為假的時候,幾乎所有的系統的處理策略都是,讓程式死掉,即

crash

掉。斷言其實是

「防禦式程式設計

」的常用的手段。防禦式程式設計的主要思想是:子程式應該不因傳入錯誤資料而被破壞,哪怕是由其他子程式產生的錯誤資料。這種思想是將可能出現的錯誤造成的影響控制在有限的範圍內。斷言能夠有效的保證資料的正確性,防止因為髒資料讓整個程式執行在不穩定的狀態下面。

每乙個執行緒都有它自己的斷言捕獲器(乙個

nsassertionhanlder

的例項),當斷言發生時,捕獲器會列印斷言資訊和當前的類名、方法名等資訊。然後丟擲乙個

nsinternalinconsistencyexception

異常讓整個程式

crash

掉。並且在當前執行緒的斷言捕獲器中執行

handlefailureinmethod:object:file:linenumber:description:

以上述資訊為輸出。

當時,當程式發布的時候,不能把斷言帶入安裝包,你不想讓程式在使用者機器上crash掉吧。開啟和關閉斷言可以在專案設定中設定assert ,在release版本中設定了ns_block_assertions之後斷言失效。

並不是說try-catch這樣的異常處理機制不好。而是,很多人在程式設計中,錯誤了使用了try-catch,把異常處理機制用在了核心邏輯中。把其當成了乙個變種的goto使用。把大量的邏輯寫在了catch中,這種情況幹嘛不用if else呢。實際上,異常處理只是使用者處理軟體中出現異常的情況。常用的情況是子程式丟擲錯誤,讓上層呼叫者知道,子程式發生了錯誤,並讓呼叫者使用合適的策略來處理異常。一般情況下,對於異常的處理策略就是crash,讓程式死掉,並且列印出堆疊資訊。而在ios程式設計中,丟擲錯誤的方式,往往採用更直接的方式。如果上層需要知道錯誤資訊,一半會傳入乙個nserror的指標的指標

於是解決

bug一般可以分兩步進行:

這篇文章是在別人的基礎上做的一些整理,原文章出處為:

bug製造專家

bug製造專家 vue框架,我愛bug 1.在頁面寫好的mounted之後,元件的生命週期找乙個角落再寫乙個mounted,便會覆蓋之前的mounted內部內容,使其不生效。2.清除響應式。再初始化物件格式的資料之後,監聽或者在其他的觸發方法下,新增乙個直接賦值操作,把相應的引用改掉。所以,響應式失...

查詢出的細節bug

1.批量匯入總是少1條資料,多執行緒匯入,少得梳理跟執行緒數一樣 忘記 conn.setautocommit true conn.setautocommit false object parmas list.toarray ps conn.preparestatement sql,statement...

解Bug之路 Druid的Bug

筆者很熱衷於解決bug,同時比較擅長 網路 協議 部分,所以經常被喚去解決一些網路io方面的bug。現在就挑乙個案例出來,寫出分析思路,以饗讀者,希望讀者在以後的工作中能夠少踩點坑。此bug是druid低版本的bug,此bug至少在1.0.12版本就已經修復。在緊張的新專案開發的日子裡,突然收到線上...