溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

關(guān)于linux和linux驅(qū)動(dòng)程序解bug的技巧和思考方法

發(fā)布時(shí)間:2020-07-15 04:30:21 來(lái)源:網(wǎng)絡(luò) 閱讀:290 作者:GaoNeil 欄目:移動(dòng)開(kāi)發(fā)

關(guān)于linux和linux驅(qū)動(dòng)程序解bug的技巧和思考方法

解bug三步:
1)看log,看現(xiàn)象。
2)對(duì)比代碼分析過(guò)程,程序流程,線程、中斷、workqueue等各個(gè)獨(dú)立執(zhí)行體的交互
3)調(diào)試,加入log、驗(yàn)證。 光看代碼只能停留在理論上,一定要親手調(diào)試一下才真正知道。另外對(duì)比正常和異常時(shí)的行為和log區(qū)別,交叉試驗(yàn),才能發(fā)現(xiàn)問(wèn)題的關(guān)鍵。注意各種調(diào)試嘗試,各種替換調(diào)試,即好的和壞的,好的A和好的C,好的A和壞的D,壞的B和好的C,壞的B和壞的D的交叉調(diào)試,才能知道問(wèn)題所在。另外,需要先寫簡(jiǎn)化代碼,驗(yàn)證簡(jiǎn)化版本,再加入后面的功能。

所有的crash、exception等都最終反映為cpu跳到異常處理程序,異常處理程序根據(jù)發(fā)生異常的地方,決定
1)如果在內(nèi)核棧,則調(diào)panic進(jìn)而回溯出內(nèi)核棧。如果看crash dump的log時(shí),看到回溯棧前部分在異常代碼中,后部分才是發(fā)生異常的棧,(后部分可能還會(huì)出現(xiàn)一部分是中斷處理程序的棧,一部分是中斷處理程序所寄生的線程的棧)。
2)如果判定發(fā)生在用戶態(tài),則異常處理代碼僅給進(jìn)程發(fā)一個(gè)信號(hào),然后切換為用戶態(tài)時(shí),信號(hào)處理程序執(zhí)行時(shí),由信號(hào)處理程序去回溯應(yīng)用棧,例如android 的native代碼的debuggerd和java的print callstack,所以用戶態(tài)棧由用戶代碼去回溯。內(nèi)核棧由內(nèi)核回溯。 回溯棧依賴于編譯器實(shí)現(xiàn)及DWARF等標(biāo)準(zhǔn)。

由于內(nèi)核棧最大只有8KB,所以編寫內(nèi)核函數(shù)時(shí),需要注意函數(shù)局部變量不應(yīng)太大,例如char A[256];之類的,占用棧大多,會(huì)因?yàn)橐欢ǖ臈I疃葧r(shí)溢出。所以可以改用static靜態(tài)變量、或者全局變量、或者動(dòng)態(tài)堆分配。

關(guān)于具體的寫linux驅(qū)動(dòng)的方法、技巧和注意事項(xiàng),歡迎觀看我的《如何編寫linux設(shè)備驅(qū)動(dòng)》的視頻:
https://edu.51cto.com/course/17132.html

另外我的相關(guān)培訓(xùn)視頻請(qǐng)看:
歡迎觀看我發(fā)布的各個(gè)課程: https://edu.51cto.com/lecturer/8896847.html

另外我的免費(fèi)的linux各種驅(qū)動(dòng)開(kāi)發(fā)課程如下:
https://edu.51cto.com/course/17138.html

我的新的更多優(yōu)惠的打包課程鏈接如下:
https://edu.51cto.com/sd/0a9d4

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI