讀核心除錯總結

2022-08-22 13:27:09 字數 1867 閱讀 5828

以下內容主要學習自debug hacks一書。

有關核心除錯方面的技巧,我更多的是將其對映為應用程式的除錯技巧。我覺得大部分都是執行緒間同步的問題。

1.對於null指標的訪問。

這個問題一般來講是比較容易確定的,一般來講就是未申請空間,或者申請空間失敗了但是沒有檢查錯誤。這個可以通過backtrace和原始碼確定發生錯誤的位置。

這裡介紹兩個gdb的新命令。info symbol和maintenance translate-address,這兩個命令可以把某個位址值轉化為符號表中的資訊,或者和符號表中某個符號的差值,這個功能在除錯時可以大大地提高效率。

2.鍊錶破壞。

這個是由於執行緒間同步問題導致的錯誤。核心中採用的確定方法是,將被刪除過的節點或者煉表項的前後指標指向兩個非法的位址,但不是null,所以當出現段錯誤時,發現非法訪問時由這兩個非法位址所引起的,那麼就可以確定是由於訪問已經被刪除的煉表項或者空鍊錶導致的問題。解決方法是不管訪問還是修改,都需要先獲得該資料結構的鎖。

3.從**發現可能的錯誤

書中講了乙個有關釋放inode的例子,inode是快取記憶體中的檔案節點,如果記憶體不夠時,就會釋放某些不使用的inode。由於執行緒間同步問題,在乙個函式中,對某個資料結構的操作過程中拿到鎖之後,中途釋放了該鎖,其他等待執行緒對該資料結構操作之後,原執行緒又拿鎖再一次對這個資料結構進行操作。這時候就可能會導致一定的問題。

這種錯誤在應用程式中,應該是出現了段錯誤,對於這個資料結構的訪問出現了問題,那麼使用gdb對這個位址進行監視,或者前後有函式的地方設定斷點,列印堆疊,確定多執行緒之間的順序。

解決這種問題,中途不釋放鎖,那麼就不會出現差錯。

4.核心停止響應(死迴圈)

重點:認真詢問故障發生時的情況

在自己的環境中復現

實驗各種各樣的條件。

5.核心停止響應(自旋鎖)

類似於應用程式中的死鎖,程序a需要獲取程序b的鎖,程序b想要獲取程序a的鎖,導致了死鎖的發生。

停止響應時,首先應該獲取到當前的dump資訊,然後分析dump資訊,當前程序正在做什麼。確定是在拿鎖,然後在拿鎖這個函式上設定斷點,列印堆疊,確定多執行緒的流程。

6.核心停止響應(自旋鎖2)

還是檢視堆疊,發現有兩個相同的函式呼叫,這兩個函式中都存在拿鎖的操作。解決過程一般結合原始碼和dump檔案進行分析。根據堆疊追蹤原始碼。

這裡的技巧是根據堆疊檢視原始碼,發現問題的原因。

7.核心停止響應(訊號量)

其實這個問題還是由於執行緒間同步的問題,這個問題是由於讀寫訊號量的問題導致的。可以檢視堆疊資訊,如果在堆疊中可以發現兩個互斥的操作,那麼問題也就解決了,但是如果不夠詳細,那麼需要重新執行,設定斷點,列印bt資訊。

8.實時程序停止響應

這裡獲取到的經驗還是通過堆疊檢視問題原因所在,還有乙個是通過檢視程序占用的時間。ps -t。

9.執行緩慢的故障

當乙個程序執行需要很長時間時,可以通過strace進行跟蹤,檢視在哪個函式中呼叫的時間最長,當然strace僅限於系統呼叫的時間。

10.cpu負載過高

這一條和前兩條,8,9,10這三條的重點我覺得在於檢視乙個程序在各個函式鎖停留的時間。這裡學習了乙個很重要的工具oprofile,可以解析每個函式的被呼叫次數,執行總時間,呼叫關係等等。如果僅僅是關心應用層函式,也就是自己所寫的函式,可以使用gprof來檢測。

總結:上面10條中,大部分都是先檢視堆疊,然後復現問題,加斷點,列印堆疊,檢視衝突所在。

有6條是屬於執行緒間同步的問題,234567這六條。

第1條屬於簡單地檢視堆疊即可確定錯誤。

最後的三條需要使用oprofile來確定函式或者程序的執行時間各方面的情況。

所以在解決問題時,一般流程,收集資訊,分析dump檔案,復現bug,查明原因,修復bug,測試。

這裡學到的手段,檢視堆疊,檢視運**況。

wrk核心除錯總結

2 虛擬機器選擇序列介面的時候 要注意選擇序列介面2 3 主機是64位作業系統下,安裝32位的windubg和64位的windug都可以 4 一定要先開虛擬機器 選擇除錯模式 然後再開啟windbug 5 在windbug快捷方式屬性裡面 目標的裡面空格後接 b k com pipe,port pi...

Linux核心除錯方法總結之sysrq

sysrq 用途 sysrq被稱為 魔術組合鍵 是內置於linux核心的除錯工具。只要核心沒有完全鎖住,不管核心在做什麼事情,使用這些組合鍵都可以蒐集包括系統記憶體使用 cpu任務處理 程序執行狀態等系統執行資訊。原理 核心幫助文件kernel documentation sysrq.txt 首先,...

linux 核心除錯

debug.hacks 一書中,介紹了如果除錯核心問題,在第五章的 實踐核心除錯 總體來說,有一下的方法來除錯核心 1.用kgdb單步除錯。具體請參見 2.加列印printk來定位。3.根據核心出錯的kernel panic oops資訊,反彙編,定位問題 4.編寫復現程式,或者創造復現條件。5.g...