硬件調(diào)試和軟件調(diào)試的一點(diǎn)點(diǎn)微小的思路1

無論是硬件調(diào)試還是軟件調(diào)試(這里說的調(diào)試是調(diào)試bug,不是調(diào)試參數(shù)).
調(diào)試的核心的目標(biāo)只有一個(gè),那就是盡可能精確地鎖定到?jīng)Q定性的錯(cuò)誤因素.
而核心的手段也只有一個(gè),那就是分解問題.
首先考察一個(gè)問題:在什么情況下,我們認(rèn)為硬件/軟件存在bug?
一般我們會(huì)覺得,當(dāng)系統(tǒng)呈現(xiàn)的實(shí)際輸出(燈的亮滅、電機(jī)的轉(zhuǎn)與不轉(zhuǎn),轉(zhuǎn)快轉(zhuǎn)慢、飛機(jī)的平衡與不平衡)和我們的設(shè)想輸出不一致的時(shí)候,我們會(huì)覺得有bug.
拿編譯過程舉例,編譯系統(tǒng)的實(shí)際輸出(有error)和設(shè)想的輸出(沒有error)不一致,我們就認(rèn)為我們寫的代碼有語法bug,編譯不通過.拿實(shí)際功能舉例子,雖然編譯通過了,但是系統(tǒng)的實(shí)際輸出(燈不亮),和設(shè)想的輸出(燈亮)不一致,我們就認(rèn)為出現(xiàn)了語法之外的錯(cuò)誤.
抽象點(diǎn)說,是人對(duì)想要認(rèn)識(shí)的對(duì)象(硬件/軟件系統(tǒng))的主觀認(rèn)識(shí),和想要認(rèn)識(shí)的對(duì)象的客觀現(xiàn)實(shí)相違背時(shí),我們就會(huì)說,"啊,有bug了".
系統(tǒng)有bug的狀態(tài),是主客觀相違背的狀態(tài),而沒bug的狀態(tài),很容易就可以知道是主客觀相統(tǒng)一的狀態(tài).
調(diào)試的過程面臨的根本矛盾,就是對(duì)系統(tǒng)的主觀認(rèn)識(shí)和系統(tǒng)客觀現(xiàn)實(shí)之間的矛盾.
要解決這個(gè)根本矛盾,我們的方法是抓住這個(gè)根本矛盾中的主要矛盾,就是:決定性的錯(cuò)誤因素.正如開頭所說,調(diào)試的核心的目標(biāo)只有一個(gè),那就是盡可能精確地鎖定到?jīng)Q定性的錯(cuò)誤因素.
就比如說,有三個(gè)同學(xué)小蔡,小許和小昆,他們?nèi)齻€(gè)人都遇到了燈不亮的問題,而經(jīng)過了不懈地努力,他們終于發(fā)現(xiàn),小蔡同學(xué)的燈不亮,是因?yàn)樗娫磾嗔?;小許同學(xué)的燈不亮,是因?yàn)闊艚z斷了;小昆同學(xué)的燈不亮,是因?yàn)樗_關(guān)壞了.
在這個(gè)例子里面,燈不亮是系統(tǒng)bug的根本矛盾,而電源斷了、燈絲斷了、開關(guān)壞了就是系統(tǒng)bug的主要矛盾,也就是決定性的錯(cuò)誤因素.
我們可以很容易地發(fā)現(xiàn),他們?nèi)齻€(gè)同學(xué)的遇到的根本矛盾相同,而主要矛盾卻各不同.
很顯然,在這個(gè)例子里,當(dāng)三個(gè)同學(xué)發(fā)現(xiàn)了他們的系統(tǒng)bug里的決定性錯(cuò)誤因素時(shí),他們也就可以很輕松地解決bug(換電源、換燈泡、換開關(guān)).
但如果他們沒有發(fā)現(xiàn)決定性的錯(cuò)誤因素時(shí),他們就很難解決bug(小蔡電源壞了卻換了燈泡、小許燈泡壞了卻換了開關(guān)、小昆開關(guān)壞了卻換了電源).這看起來很傻,但根據(jù)我的一些已有的一點(diǎn)點(diǎn)微小的觀察,發(fā)現(xiàn)有很多同學(xué)像沒有找到?jīng)Q定性的錯(cuò)誤因素的小蔡同學(xué),小許同學(xué),小昆同學(xué)一樣,在做電源壞了卻換燈泡的工作.
還經(jīng)常會(huì)出現(xiàn)電源壞了卻換燈泡,發(fā)現(xiàn)不好使又去換開關(guān),發(fā)現(xiàn)不對(duì)勁又去換燈泡的死循環(huán),這就叫做不會(huì)調(diào)試.
to be continue......