kernel啟動控制台還不可用時發生cr

2021-06-19 19:33:13 字數 1344 閱讀 5744

在除錯linux kernel時,如果crash發生在控制台還不可用時,那將沒有任何資訊能夠被列印,那分析原因就變成了一摸黑。有以下方法有助於幫助分析:

1, early printk

在kernel配置選項中啟用config_early_printk=y, 那將可借助early_printk()函式列印資訊,用early_printk在kernel啟動的**中加入一些列印點,可以幫助定位kernel boot到哪一位置。

early_printk的配置選項位於kernel hacking, 還必須開啟了config_debug_ll=y,才能啟用early printk.

kernel hacking ---->

[*] kernel low-level debugging functions

[*] early printk

這一功能,需要你的arch實現底層的uart傳送函式, 即include/mach/debug-macro.s中的addruart, senduart, waituart, busyuart等函式。

2, dump log_buf記憶體

printk函式列印的資訊首先都是存在log_buf這塊記憶體的,即使console還沒enable,printk函式也一樣可以被呼叫,因此當kernel crash時,可以通過**器檢視log_buf 這段記憶體,它裡面存的就是通過printk列印的資訊,如果沒有**器,也可以重啟bootloader,在bootloader裡通過dump mem來檢視。

log_buf這段記憶體的位址如何確定?通過system.map檔案搜尋log_buf,你就會找到log_buf的位址,如:

c0535bd8 b printk_buf

c0535fd8 b printk_time

c0535fdc b __log_buf

c0539fdc b cpu_online_bits

c0539fe0 b cpu_active_bits

c0539fe4 b cpu_present_bits

c0539fe8 b cpu_possible_bits

c0539fec b sys_tz

c053a000 b softirq_vec

這裡我們看到log_buf的記憶體位址在c0535fdc,這是個虛擬位址,根據kernel位址對映規律,從mem_phy_start到mem_phy_end,都會一一對映到0xc0000000: (0xc0000000 + mem_phy_size),因此假設我們記憶體的實體地址起始是0x0,那麼這裡log_buf的實際實體地址為0x00535fdc。

在確認完log_buf的記憶體位址之後,就可以用**器也好,bootloader也好,去檢視printk列印的內容了。

js 控制按鈕點選後不可用

varwait 60 functiontime o else,1000 document.getelementbyid btn onclick function script 收集有效使用者,為了防止使用者多次點選某按鈕,造成多次提交表單的操作。某些按鈕需要在點選後實現不可用操作。傳送使用ajax實...

was控制台怎麼重新啟動 was啟動

武漢 server was 使用文件 1.was 管理平台使用者名稱及密碼 使用者名稱 wasadmin密碼 acc2.was安裝路徑 was控制台部署在 10.188.3.21 was程式安裝在 10.188.3.20 和10.188.3.21 主機上,安裝路徑 usr ibm websphere...

Weblogic啟動成功,控制台打不開

有時候,我們在linux作業系統上成功啟動了weblogic,也檢視了7001埠的狀態是開啟的。但是訪問weblogic控制台沒有反應,也沒有報錯。使用 netstat ano grep 7001 檢視埠的狀態 可是訪問weblogic控制台,還是沒有反應。我們在本地ping 192.168.100...