您好,登錄后才能下訂單哦!
解bug三步:
1)看log,看現象。
2)對比代碼分析過程,程序流程,線程、中斷、workqueue等各個獨立執行體的交互
3)調試,加入log、驗證。 光看代碼只能停留在理論上,一定要親手調試一下才真正知道。另外對比正常和異常時的行為和log區別,交叉試驗,才能發現問題的關鍵。注意各種調試嘗試,各種替換調試,即好的和壞的,好的A和好的C,好的A和壞的D,壞的B和好的C,壞的B和壞的D的交叉調試,才能知道問題所在。另外,需要先寫簡化代碼,驗證簡化版本,再加入后面的功能。
所有的crash、exception等都最終反映為cpu跳到異常處理程序,異常處理程序根據發生異常的地方,決定
1)如果在內核棧,則調panic進而回溯出內核棧。如果看crash dump的log時,看到回溯棧前部分在異常代碼中,后部分才是發生異常的棧,(后部分可能還會出現一部分是中斷處理程序的棧,一部分是中斷處理程序所寄生的線程的棧)。
2)如果判定發生在用戶態,則異常處理代碼僅給進程發一個信號,然后切換為用戶態時,信號處理程序執行時,由信號處理程序去回溯應用棧,例如android 的native代碼的debuggerd和java的print callstack,所以用戶態棧由用戶代碼去回溯。內核棧由內核回溯。 回溯棧依賴于編譯器實現及DWARF等標準。
由于內核棧最大只有8KB,所以編寫內核函數時,需要注意函數局部變量不應太大,例如char A[256];之類的,占用棧大多,會因為一定的棧深度時溢出。所以可以改用static靜態變量、或者全局變量、或者動態堆分配。
關于具體的寫linux驅動的方法、技巧和注意事項,歡迎觀看我的《如何編寫linux設備驅動》的視頻:
https://edu.51cto.com/course/17132.html
另外我的相關培訓視頻請看:
歡迎觀看我發布的各個課程: https://edu.51cto.com/lecturer/8896847.html
另外我的免費的linux各種驅動開發課程如下:
https://edu.51cto.com/course/17138.html
我的新的更多優惠的打包課程鏈接如下:
https://edu.51cto.com/sd/0a9d4
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。