嵌入式Linux Kernel錯誤跟蹤技術
//取得函數調用棧幀的內容
//填充信息記錄的記錄頭部
//將上面的循環中取得的信息保存到非易失性存儲器中
write_to_nvram((void *)bt_nvram_ptr,bt_record_header,sizeof(bt_info_t));
}
3 驗證評估LCRT機制
3.1 部署LCRT機制
部署LCRT機制,使LCRT機制發揮作用前需要做的相關工作有:
(1)針對目標Linux內核編譯LCRT機制的Linux內核模塊部分;
(2) 將LCRT機制的內核模塊部分載入Linux內核。
3.2 實驗結果
為了實驗LCRT機制的作用效果,構造一個會造成Linux內核崩潰的設備驅動模塊,記這個內核驅動模塊為bugguy.ko,列出如下所示的bugguy.ko中會引起Linux內核崩潰的代碼如下所示:
irqreturn_t my_timer_interrupt(int irq,void *dev_id,struct pt_regs* regs)
{
確認硬件狀態并清除中斷狀態
if(ujiffies > 5000) {
void * ill_pointer=NULL;
*(unsigned long *)ill_pointer=0;
}
else {
ujiffies++;
}
return IRQ_HANDLED;
}
說明:用黑體標出的代碼即為產生bug的代碼
從上面的代碼可以看出,這個錯誤是對空指針進行解析而造成的。在一個中斷處理函數中如果發生對空指針的解析,將會引起Linux內核的崩潰。在部署完成LCRT機制的嵌入式linux系統上將這個bugguy.ko載入Linux內核,使得會引起Linux內核崩潰的中斷處理程序得以運行,LCRT機制可以將相關的信息保存到非易失性存儲器中,在系統復位后,通過LCRT機制的用戶空間工具,可以將保存的信息讀取出來。實驗結果顯示,可以得到如圖2所示的函數調用鏈信息。
圖2標注即為會引起Linux內核崩潰的錯誤代碼的中斷處理函數即真正引起系統宕機的“罪魁禍首”。而記錄下的所有信息僅僅占用了不到1KB的存儲空間,寫入非易失性存儲器所耗用的時間控制在50ms以內。在使用少量空間和少量時間的情況下,所記錄下的信息對于查找問題和解決問題都有較大的幫助。
實驗結果表明,在LCRT機制的作用下,可以快速地定位到嵌入式Linux系統中隱藏的可能會導致系統宕機的軟件缺陷。這就為后續的故障解決和軟件完善提供了關鍵的輔助信息。對嵌入式Linux內核而言,即是為提高Linux內核的穩定性和可靠性提供了幫助。
在基于ARM的嵌入式Linux應用中,開發LCRT機制來記錄系統內核發生崩潰時引起崩潰的函數調用鏈和棧信息到非易失性存儲器中,截至目前為止,LCRT機制可以記錄基于ARM的嵌入式Linux內核發生崩潰時的函數調用鏈信息,可直接得到函數名稱、函數調用鏈中單個函數被調用時的參數信息以及函數調用鏈中的函數各自的棧幀信息。這些記錄下來的信息對于完善和發展基于ARM的嵌入式Linux應用具有重要的輔助意義。
linux操作系統文章專題:linux操作系統詳解(linux不再難懂)
評論