Linux核心崩潰轉儲機制

2021-06-26 23:11:12 字數 4946 閱讀 6085

當 系統出現panic的時候,kdump(核心崩潰轉儲機制)會通過呼叫kexec來快速的啟動預先準備好的dump-capture kernel.該啟動方式與快速啟動機制類似,不會經過bios,屬於熱啟動。dump-capture kernel 啟動後,前乙個核心執行時的記憶體映象會被儲存到/proc/vmcore,可以通過cp 或者scp將其vmcore檔案拷貝到磁碟

上。重啟系統後,即可通過分析工具對剛才儲存的vmcore檔案進行分析,查詢導致panic的原因。

dump-capture kernel 啟動只是使用少量的記憶體,並且這些記憶體由第乙個核心提供。這樣設計

保證了第乙個核心啟動且正在執行中的dma不會破壞第二個核心的執行。在核心崩潰之前所 有有關於核心映像的必要資訊都用elf格式編碼並儲存在預先保留的記憶體區域中。

目前kdump和kexec只支援 x86,x86_64,ppc64,ia64這四種架構。設定

1.安裝kexec-tools工具,至於如何安裝,在此不再多 說。

2.編譯支援kdump的系統核心,我們叫他primary kernel。

確認以下核心選項已經被開啟並重編核心。

1) 使能"kexec system call => processor type and features." ,使核心支援kexec系統呼叫

config_kexec=y

2) 使能"filesystem" => "pseudo

filesystems."=> "sysfs file system support"

config_sysfs=y

注意:如果"general setup."=>"configure standard kernel features (for small system)" 沒有開啟的話,"sysfs file system support"可能並不會在"pseudo

filesystems."中出現,如果是 這種情況,可以直接檢nfig檔案,確認config_sysfs是不是已經開啟。

grep 'config_sysfs'nfig

3)使能"kernel hacking."=>"compile the kernel with debug info" ,保證編譯出的核心帶有除錯符號。因為dump分析工具在讀取和分析dump檔案時需要這些除錯符號。

config_debug_info=y

3. 編譯dump-capture kernel

針對不同的架構,核心選項也有不同,但是不論哪種架構,以下兩個選項是必選的

"processor type and features"=> "kernel crash dumps"

config_crash_dump=y

"filesystems" => "pseudo filesystems"=>"/proc/vmcore support"

config_proc_vmcore=y

(當 config_crash_dump 被選中時,config_proc_vmcore會被自動選中)

下面我們看一下針對不同的架構

,編 譯核心還有哪些特殊的選項

1)i386 和x86_64

*在i386上,使能高記憶體支援"processor type and features"=>"high memory support"

config_highmem64g=y

orconfig_highmem4g

* 在i386 和x86_64上,關閉"processor type and features"=>"symmetric multi-processing support"

config_smp=n

如果沒有將該選項設為n,則需要在載入dump- capture kernel時指定引數maxcpus=1。

*如果想編譯乙個載入位址可浮動的核心,則選中"processor type and features"=>"build a relocatable kernel"

config_relocatable=y

* 設定合適的值給"processor type and features"=>"physical address where the kernel is loaded"

該值的設定與核心載入位址是否是可浮動的(即是否選中config_relocatable)有關。

如 果核心載入位址不可浮動, 則該值必須與crashkernel=y@x中的x相同(至於crashkernel=y@x的含義即如何使用將在後面講到),例 如:crashkernel=64m@16m,則config_physical_start=0x100000

0。如果核心載入位址可 浮動,則config_physical_start的值便可不必在意,使用預設的即可。不過為了保險起見,為了能使kdump正確執 行,config_physical_start的值不論在何時,都要於x的值相同。

2)ppc64

除了前面兩個必須的選項,其 餘選項預設即可。

3)ia64

除了前面兩個必須的選項,其餘選項預設即可。

4.準備好兩個核心後,即可按如下步 驟使用kdump

1)使用primary kernel啟動系統,但是要在啟動引數中加入「crashkernel=y@x」,y表示為dump-capture kernel 預留了多少記憶體空間,x該段空間的起始位址,即核心選項中config_physical_start的值。

對於x86和x86_64架構,一般 使用crashkernel=64m@16m,config_physical_start=0x1000000

對於ppc64架構,一般使用 crashkernel=128m@32m,config_physical_start=0x2000000

對於ia64架構,通常使用 crashkernel=256m@256m。

2)載入dump-capture kernel

系統啟動後,即可載入dump- capture kernle。

不同的架構

,可以選擇使用為壓縮的dump-capture kernle (vmlinux) 或者壓縮過的dump-capture kernle(bzimage/vmlinuz)。

i386 和x86_64:

如果dump-capture kernel編譯時未選中config_relocatable,則只能使用vmlinux

如果dump-capture kernel編譯時開啟了config_relocatable,則可以使用bzimage/vmlinuz

ppc64 :

只能使用vmlinux

ia64:

可以使用vmlinux或者vmlinuz.gz

載入方法:

kexec -p \

--initrd=--args-linux \

dump- capture-kernel-vmlinux-image:表示存放dump-capture kernel 的路徑

initrd-for- dump-capture-kernel:表示initrd的路徑,如果沒有,可以省略該引數

--args-linux

:表示pass linux kernel style

options,沒看明白什麼意思,但是ia64架構不需要加這個引數,其他架構都要有。

arch-specific-options:核心啟動引數的一部分,該處根據不同架構

,填寫不同引數。 i386, x86_64 和 ia64 填"1 irqpoll maxcpus=1 reset_devices",ppc64填"1 maxcpus=1 noirqdistrib reset_devices"。

注:預設情況下,elf檔案頭採用elf64格式儲存以支援那些擁有超過 4gb記憶體的系統。但是可以指定「--elf32-core-headers」標誌

以 強制使用elf32格式的elf檔案頭。這個標誌是有必要注意的,乙個重要的原因就是:當前版本的gdb不能在乙個32位系統上開啟乙個使用elf64格 式的vmcore檔案。elf32格式的檔案頭不能使用在乙個「沒有實體地址擴充套件」(non-pae)的系統上。(即是說,少於4gb記憶體的系統)

1 這個引數,將啟動「轉儲捕捉核心」到乙個沒有網路支援的單使用者模式。如果你希望有網路支援,那麼使用「init 3」

maxcpus=1,這個前 面說過,如果config_smp=n,則需要在啟動引數中加入maxcpus=1。

irqpoll 的啟動引數可以減低由於在「轉儲捕獲核心」中使用了「共享中斷」技術而導致出現驅動初始化失敗這種情況發生的概率。

舉例:kexec -p  /boot/vmlinux

3)測試 kdump是否成功

手動產生乙個crash:echo c > /proc/sysrq-trigger。

或者可以些乙個強制產生 crash的模組。

如果成功,系統將會進入熱啟動過程,系統啟動完成後,可以執行一下uname -a ,看看核心的名字是不是有-kdump的標籤呢?

然後就可以把生成的轉儲檔案vmcore拷貝出來了,直接cp即可:

cp /proc/vmcore

也可以通過/dev/oldmem這個裝置將其考出:

cd ~

mknod /dev/oldmem c 1 12

dd if=/dev/oldmem of=oldmem.001

成功將vmcore 拷貝出來後即可重啟系統了。

4)分析vmcore檔案

在開始分析「轉儲檔案」之前,應該確定重啟到乙個穩定的核心。

可以 使用gdb在『轉儲檔案』上做有限的分析。分析的時候需要「帶有除錯資訊的vmlinux檔案」(編譯的時候帶有-g選項),執行如下命令:

gdb vmlinux

vmcore

注意:gdb不能分析x86平台上以elf64格式產生的「核心轉儲檔案」。在乙個最大記憶體為4gb的系統上,可 以通過在「轉儲捕捉核心」上指定「--elf32-core-headers」標誌

來使用elf32格式的檔案頭。

~anderson/

以上文件

主要是翻譯自核心自帶文件linux/documentation/kdump/kdump.txt,部分使用自己的語言表達。如有錯誤,請指正。

崩潰轉儲(rust)

崩潰轉儲 google breakpad 使用 breakpad不需要安裝,使用方式為侵入式的,需要引入額外 可以作為外部庫引入,也可以直接使用原始碼。breakpad 對程序 作業系統程序 有效,一次引入所有模組均有效。breakpad使用時需要提供庫 或可執行檔案 對應的 text format...

核心檔案 核心轉儲

核心檔案 核心檔案 core file 也稱核心轉儲 core dump 是作業系統 在程序收到某些訊號 而終止執行時,將此時程序位址空間的內容以及有關程序狀態的其他資訊寫出的乙個磁碟檔案。這種資訊往往用於除錯。核心檔案一詞 於磁芯記憶體 core memory 核心轉儲 通常這個詞的含義是乙個動作...

linux下段錯誤未核心轉儲

此事的起因是簡單構建了乙個demo來載入乙個模組進行檔案拷貝測試,奇怪的是拷貝小檔案之後操作目錄沒有問題,但是拷貝乙個超大的檔案之後操作目錄centos必定提示段錯誤,但是未進行核心轉儲。剛開始以為是未啟用core dump,於是首先通過ulimit c檢視系統已經啟用了core dump,但是始終...