除錯 Linux 核心故障

2021-10-02 05:44:45 字數 2562 閱讀 3099

結論linux 核心是作業系統的核心,它控制對系統資源(例如:cpu、i/o裝置、物理記憶體和檔案系統)的訪問。在引導過程中以及系統執行時,核心會將各種訊息寫入核心環形緩衝區。這些訊息包括有關系統操作的各種資訊。

核心環形緩衝區是物理記憶體的一部分,用於儲存核心的日誌訊息。它具有固定的大小,這意味著一旦緩衝區已滿,較舊的日誌記錄將被覆蓋。

dmesg 命令列實用程式用於在 linux 和其他類似 unix 的作業系統中列印和控制核心環形緩衝區。對於檢查核心啟動訊息和除錯與硬體相關的問題很有用。

使用 dmesg 命令

語法如下:

dmesg [options]

在不帶任何選項的情況下呼叫時,dmesg 將所有訊息從核心環形緩衝區寫入標準輸出:

$ dmesg

預設情況下,所有使用者都可以執行 dmesg 命令。但是,在某些系統上,非 root 使用者可能會限制對 dmesg的訪問。在這種情況下,呼叫 dmesg`時您將收到如下錯誤訊息:

dmesg: read kernel buffer failed: operation not permitted

核心引數 kernel.dmesg_restrict 指定非特權使用者是否可以使用 dmesg 檢視來自核心日誌緩衝區的訊息。要刪除限制,請將其設定為零:

$ sudo sysctl -w kernel.dmesg_restrict=0

通常,輸出包含很多資訊行,因此只能看到輸出的最後一部分。要一次檢視一頁,請將輸出通過管道傳送到分頁實用程式,例如 less 或 more:

$ dmesg --color=always | less

其中的 --color=always 引數用於保留彩色輸出。

dmesg 從 /proc/kmsg 虛擬檔案中讀取核心生成的訊息。該檔案提供了到核心環形緩衝區的介面,並且只能由乙個程序開啟。如果系統上正在執行 syslog 程序,並且你嘗試使用 cat 或 less 命令讀取檔案,則命令將掛起。

syslog 守護程式將核心訊息轉儲到 /var/log/dmesg,因此你也可以使用該日誌檔案:

$ cat /var/log/dmesg

格式化 dmesg 輸出

dmesg 命令提供了許多選項,可幫助你格式化和過濾輸出。

dmesg 中最常用的選項之一是 -h(–human),它將輸出更容易讀的結果。

$ dmesg -h

要列印人類可讀的時間戳,請使用 -t(–ctime 選項:

$ dmesg -t

[mon oct 14 14:38:04 2019] ipv6: addrconf(netdev_change): wlp1s0: link becomes ready

時間戳格式也可以使用 --time-format 選項設定,可以是 ctime,reltime,delta,notime或 iso。例如:要使用增量格式,你可以輸入:

$ dmesg --time-format=delta

你也可以組合兩個或多個選項:

$ dmesg -h -t

要實時** dmesg 命令的輸出,請使用 -w(–follow)選項:

$ dmesg --follow

過濾 dmesg 輸出

你可以將 dmesg 輸出限制為給定的設施和等級。dmesg 支援以下型別:

kern-核心訊息

user-使用者級訊息

mail-郵件系統

daemon-系統守護程式

auth-安全/授權訊息

syslog-內部 syslogd 訊息

lpr-行式印表機子系統

news-網路新聞子系統

-f(--facility ) 選項允許你將輸出限制為特定的裝置,該選項接受乙個或多個逗號分隔的功能。

例如,要僅顯示核心和系統守護程式訊息,可以使用:

$ dmesg -f kern,daemon

emerg-系統無法使用

alert-必須立即採取措施

crit-緊急情況

err-錯誤條件

warn-警告條件

notice-正常但重要的條件

info-資訊性

debug-除錯級訊息

-l(--level )選項允許你將輸出限制為定義的級別,該選項接受乙個或多個逗號分隔的級別。

以下命令僅顯示錯誤和嚴重訊息:

$ dmesg -l err,crit

清除環形緩衝區

-c(–clear) 選項可讓您清除環形緩衝區:

$ sudo dmesg -c

只有 root 或具有 sudo 特權的使用者才能清除緩衝區。

要在清除之前列印緩衝區內容,請使用 -c(–read-clear)選項:

$ sudo dmesg -c

如果要在清除檔案之前將當前 dmesg 日誌儲存到檔案中,你可以將輸出重定向到檔案:

$ dmesg > dmesg_messages

結論dmesg 命令允許你檢視和控制核心環形緩衝區。對核心或硬體問題進行故障排除時,它非常有用。

在終端中輸入 man dmesg,你可以獲取有關所有可用 dmesg 選項的資訊。

linux 核心除錯

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

linux 核心除錯(一)

1 要先修改linux kernel 源 的頂層makefile cc cross compile gcc 修改為cc cross compile gcc g 這樣編譯的核心模組就帶有debug資訊 arm linux objdump s d opps.ko log vi log 這樣就可以看到彙編...

linux核心崩潰除錯

用kdump 和 crash 工具分析核心的奔潰資訊 當linux核心發生崩潰的時候,可以用kdump等方式收集核心崩潰之前的記憶體,生成乙個轉儲檔案vmcore,核心開發者通過分析轉儲檔案core就可以診斷出核心崩潰的原因,從而進行作業系統 的改進,用crash工具分析vmcore檔案 crash...