Linux核心調試方法
kdb:只能在彙編代碼級進行調試;
優點是不需要兩台機器進行調試。
gdb:在調試模組時缺少一些至關重要的功能,它可用來查看核心的運行情況,包括反組譯碼核心功能。
kgdb:能很方便的在源碼級對核心進行調試,缺點是kgdb只能進行遠端偵錯,它需要一根串口線及兩台機器來調試核心(也可以是在同一台主機上用vmware軟體運行兩個作業系統來調試)
printk() 是調試核心代碼時最常用的一種技術。在核心代碼中的特定位置加入printk() 調試調用,可以直接把所關心的資訊打列印到螢幕上,從而可以觀察程式的執行路徑和所關心的變數、指標等資訊。 Linux 核心調試器(Linux kernel debugger,kdb)是 Linux 核心的補丁,它提供了一種在系統能運行時對核心記憶體和資料結構進行檢查的辦法。Oops、KDB在文章掌握 Linux 調試技術有詳細介紹,大家可以參考。 Kprobes 提供了一個強行進入任何核心常式,並從中斷處理器無幹擾地收集資訊的介面。使用 Kprobes 可以輕鬆地收集處理器寄存器和全域資料結構等調試資訊,而無需對Linux核心頻繁編譯和啟動,具體使用方法,請參考使用 Kprobes 調試核心。
/proc檔案系統
在 /proc 檔案系統中,對虛擬檔案的讀寫操作是一種與核心通訊的手段,要查看核心迴環緩衝區中的訊息,可以使用 dmesg 工具(或者通過 /proc 本身使用 cat /proc/kmsg 命令)。清單 6 給出了 dmesg 顯示的最後幾條訊息。
清單 6. 查看來自 LKM 的核心輸出
[root@plato]# dmesg | tail -5cs: IO port probe 0xa00-0xaff: clean.eth0: Link is downeth0: Link is up, running at 100Mbit half-duplexmy_module_init called. Module is now loaded.my_module_cleanup called. Module is now unloaded.
可以在核心輸出中看到這個模組的訊息。現在讓我們暫時離開這個簡單的例子,來看幾個可以用來開發有用 LKM 的核心 API。
調試工具
使用調試器來一步步地跟蹤代碼,查看變數和電腦寄存器的值。在核心中使用互動式調試器是一個很複雜的問題。核心在它自己的地址空間中運行。許多使用者空間下的調試器所提供的常用功能很難用於核心之中,比如斷點和單步調試等。
| 目錄 [隱藏] 1核心bug跟蹤 1.1oops訊息分析 1.2系統崩潰重啟動 1.2.1(1)工具kexec介紹 1.2.2(2)kdump介紹 1.3SysRq魔術按鍵組合列印核心資訊 1.4命令strace 1.5用函數printk列印核心資訊 1.6核心探測kprobe 1.7Systemtap調試 1.7.1(1)Systemtap原理 1.7.2(2)stap程式 1.7.3(3)Systemtap指令碼文法 2kdb核心調試器 2.1安裝kdb 2.2使用kdb調試命令 3kgdb 3.1kgdb調試原理 3.2建立kdbg聯機調試的方法 3.3調試核心模組 3.4調試核心 4使用UML調試Linux核心 4.1UML原理 4.2編譯UML模式客戶機Linux核心 4.3運行UML 4.4建立串列線和控制台 4.5建立網路 4.6在虛擬機器間共用檔案系統 4.7建立UML的檔案系統 4.8主機檔案訪問 4.9核心調試 5Assert 陳述式 6同步鎖調試 |
核心bug跟蹤
oops訊息分析
(1)oops訊息產生機制
oops(也稱 panic),稱程式運行崩潰,程式崩潰後會產生oops訊息。應用程式或核心線程的崩潰都會產生oops訊息,通常發生oops時,系統不會發生死機,而在終端或日誌中列印oops資訊。
當使用NULL指標或不正確的指標值時,通常會引發一個 oops 訊息,這是因為當引用一個非法指標時,頁面映射機制無法將虛擬位址映像到物理地址,處理器就會向作業系統發出一個"頁面失效"的訊號。核心無法"換頁"到並不存在的地址上,系統就會產生一個"oops"。
oops 顯示發生錯誤時處理器的狀態,包括 CPU 寄存器的內容、頁描述符表的位置,以及其一些難理解的資訊。這些訊息由失效處理函數(arch/*/kernel/traps.c)中的printk 語句產生。較為重要的資訊就是指令指標(EIP),即出錯指令的地址。
由於很難從十六進位數值中看出含義,可使用符號解析工具klogd。klogd 守護進程能在 oops 訊息到達記錄檔案之前對它們解碼。klogd在預設情況下運行並進行符號解碼。
通常Oops文本由klogd從核心緩衝區裡讀取並傳給syslogd,由syslogd寫到syslog檔案中,該檔案典型為/var/log/messages(依賴於/etc/syslog.conf)。如果klogd崩潰了,使用者可"dmesg > file"從核心緩衝區中讀取資料並儲存下來。還可用"cat /proc/kmsg > file"讀取資料,此時,需要使用者中止傳輸,因為kmsg是一個"永不結束的檔案"。
當保護錯誤發生時,klogd守護進程自動把核心日誌資訊中的重要地址翻譯成它們相應的符號。klogd執行靜態地址翻譯和動態地址翻譯。靜態地址翻譯使用System.map檔案將符號地址翻譯為符號。klogd守護進程在初始化時必須能找到system.map檔案。
動態地址翻譯通常對核心模組中的符號進行翻譯。核心模組的記憶體從核心動態記憶體池裡分配,核心模組中符號的位置在核心裝載後才最終確定。
Linux核心提供了調用,允許程式決定裝載哪些模組和它們在記憶體中位置。通過這些系統調用,klogd守護進程產生一張符號表用於調試發生在可裝載模組中的保護錯誤。核心模組的裝載或者卸載都會自動向klogd發送訊號,klogd可將核心模組符號的地址動態翻譯為符號字串。
(2)產生oops的範例代碼
使用null 指標和緩衝區溢位是產生oops的兩個最常見原因。下面兩個函數faulty_write和faulty_read是一個核心模組中的寫和讀函數,分別示範了這兩種情況。當核心調用這兩個函數時,會產生oops訊息。 函數faulty_write刪除一個NULL指標的引用,由於0不是一個有效指標值,核心將列印oops資訊,並接著,殺死調用些函數的進程。
ssize_t faulty_write (struct file *filp, const char _ _user *buf, size_t count, loff_t *pos){ /* make a simple fault by dereferencing a NULL pointer */ *(int *)0 = 0; return 0;}
函數faulty_write產生oops資訊列出如下(注意 EIP 行和 stack 追蹤記錄中已經解碼的符號):
Unable to handle kernel NULL pointer dereference at virtual address \
00000000
printing eip: c48370c3 *pde = 00000000 Oops: 0002 CPU:0 EIP: 0010:[faulty:faulty_write+3/576] EFLAGS: 00010286 eax: ffffffea ebx: c2c55ae0 ecx: c48370c0 edx: c2c55b00 esi: 0804d038 edi: 0804d038 ebp: c2337f8c esp: c2337f8c ds: 0018 es: 0018 ss: 0018 Processcat (pid: 23413,stackpage=c2337000) Stack: 00000001 c01356e6 c2c55ae0 0804d038 00000001 c2c55b00 c2336000 \
00000001 0804d038 bffffbd4 00000000 00000000 bffffbd4 c010b860 00000001 \ 0804d038 00000001 00000001 0804d038 bffffbd4 00000004 0000002b 0000002b \ 00000004
Call Trace: [sys_write+214/256][system_call+52/56]
Code: c7 05 00 00 00 00 00 00 00 00 31 c0 89 ec 5d c3 8d b6 00 00
上述oops訊息中,字串 3/576 表示處理器正處於函數的第3個位元組上,函數整體長度為 576 個位元組。 函數faulty_read拷貝一個字串到本地變數,由於字串比目的地數組長造成緩衝區溢位。當函數返回時,緩衝區溢位導致產生oops資訊。因為返回指令引起指令指標找不到運行地址,這種錯誤很難發現和跟蹤。
ssize_t faulty_read(struct file *filp, char _ _user *buf, size_t count, loff_t *pos){ int ret; char stack_buf[4]; /* Let's try a buffer overflow */ memset(stack_buf, 0xff, 20); if (count > 4) count = 4; /* copy 4 bytes to the user */ ret = copy_to_user(buf, stack_buf, count); if (!ret) return count; return ret;}
函數faulty_read產生oops資訊列出如下:
EIP: 0010:[<00000000>]
Unable to handle kernel paging request at virtual address ffffffff printing eip: ffffffff Oops: 0000[#5] SMP CPU: 0 EIP: 0060:[] Not tainted EFLAGS: 00010296(2.6.6) EIP is at 0xffffffff eax: 0000000c ebx: ffffffff ecx: 00000000 edx: bfffda7c esi: cf434f00 edi: ffffffff ebp: 00002000 esp: c27fff78 ds: 007b es: 007b ss: 0068 Processhead (pid: 2331,threadinfo=c27fe000 task=c3226150) Stack: ffffffff bfffda70 00002000 cf434f20 00000001 00000286 cf434f00 fffffff7 bfffda70 c27fe000 c0150612 cf434f00 bfffda70 00002000 cf434f20 00000000 00000003 00002000 c0103f8f 00000003 bfffda70 00002000 00002000 bfffda70 Call Trace:[] sys_read+0x42/0x70[] syscall_call+0x7/0xb
Code: Bad EIP value.
在上述oops訊息中,由於緩衝區溢位,僅能看到函數調用棧的一部分,看不見函數名vfs_read和faulty_read,並且代碼(Code)處僅輸出"bad EIP value.",列在棧上開始處的地址"ffffffff"表示核心棧已崩潰。
(3)oops資訊分析
面對產生的oops資訊,首先應尋找來源程式發生oops的位置,通過查看指令指令寄存器EIP的值,可以找到位置,如:EIP: 0010:[faulty:faulty_write+3/576]。
再尋找函數調用棧(call stack)可以得到更多的資訊。從函數調用棧可辨別出局部變數、全域變數和函數參數。例如:在函數faulty_read的oops資訊的函數調用棧中,棧頂為ffffffff,棧頂值應為一個小於ffffffff的值,為此值,說明再找不回調用函數地址,說明有可能因緩衝區溢位等原因造成指標錯誤。
在x86構架上,使用者空間的棧從0xc0000000以下開始,遞迴值bfffda70可能是使用者空間的棧地址。實際上它就是傳遞給read系統調用的緩衝區地址,系統調用read進入核心時,將使用者空間緩衝區的資料拷貝到核心空間緩衝區。
如果oops資訊顯示觸發oops的地址為0xa5a5a5a5,則說明很可能是因為沒有初始化動態記憶體引起的。
另外,如果想看到函數調用棧的符號,編譯核心時,請開啟CONFIG_KALLSYMS選項。
klogd 提供了許多資訊來協助分析。為了使 klogd 正確地工作,必須在 /boot 中提供符號表檔案 System.map。如果符號表與當前核心不匹配,klogd 就會拒絕解析符號。
有時核心錯誤會將系統完全掛起。例如代碼進入一個死迴圈,系統不會再響應任何動作。這時可通過在一些關鍵點上插入 schedule 調用可以防止死迴圈。 系統崩潰重啟動
由於核心運行錯誤,在某些極端情況下,核心會運行崩潰,核心崩潰時會導致死機。為瞭解決此問題,核心引入了快速裝載和重啟動新核心機制。核心通過kdump在崩潰時觸發啟動新核心,儲存舊記憶體映像以便於調試,讓系統在新核心上運行 ,從而避免了死機,增強了系統的穩定性。 (1)工具kexec介紹
kexec是一套系統調用,允許使用者從當前正執行的核心裝載另一個核心。使用者可用shell命令"yum install kexec-tools"安裝kexec工具包,安裝後,就可以使用kexec命令。
工具kexec直接啟動進入一個新核心,它通過系統調用使使用者能夠從當前核心裝載並啟動進入另一個核心。在當前核心中,kexec執行BootLoader的功能。在標準系統啟動和kexec啟動之間的主要區別是:在kexec啟動期間,依賴於硬體構架的韌體或BIOS不會被執行來進行硬體初始化。這將大大降低重啟動的時間。
為了讓核心的kexec功能起作用,核心編譯配置是應確認先擇了"CONFIG_KEXEC=y",在配置後產生的.config檔案中應可看到此條目。
工具kexec的使用分為兩步,首先,用kexec將調試的核心裝載進記憶體,接著,用kexec啟動裝載的核心。
裝載核心的文法列出如下:
kexec -l kernel-image --append=command-line-options --initrd=initrd-image
上述命令中,參數kernel-image為裝載核心的對應檔,該命令不支援壓縮的核心映像檔案bzImage,應使用非壓縮的核心對應檔vmlinux;參數initrd-image為啟動時使用initrd對應檔;參數command-line-options為命令列選項,應來自當前核心的命令列選項,可從檔案"/proc/cmdline"中提取,該檔案的內容列出如下:
^-^$ cat /proc/cmdline
ro root=/dev/VolGroup00/LogVol00 rhgb quiet
例如:使用者想啟動的核心映射為/boot/vmlinux,initrd為/boot/initrd,則kexec載入命令列出如下:
Kexec –l /boot/vmlinux –append=/dev/VolGroup00/LogVol00 initrd=/boot/initrd
還可以加上選項-p或--load-panic,表示裝載新核心在系統核心崩潰使用。
在核心裝載後,用下述命令啟動裝載的核心,並進行新的核心中運行:
kexec -e
當kexec將當前核心遷移到新核心上運行時,kexec拷貝新核心到預保留記憶體塊,該保留位置如圖1所示, 原系統核心給kexec裝載核心預保留一塊記憶體(在圖中的陰影部分),用於裝載新核心,其他記憶體地區在未裝載新核心時,由原系統核心使用。
圖1 kexec裝載的核心所在預保留位置示意圖
在x86構架的機器上,系統啟動時需要使用第一個640KB實體記憶體,用於核心裝載,kexec在重啟動進入轉儲捕捉的核心之前備份此地區。相似地,PPC64構架的機器在啟動裡需要使用第一個32KB物理核心,並需要支援64K頁,kexec備份第一個64KB記憶體。 (2)kdump介紹
kdump是基於kexec的崩潰轉儲機制(kexec-based Crash Dumping),無論核心核心需要轉儲時,如:系統崩潰時,kdump使用kexec快速啟動進入轉儲捕捉的核心。在這裡,原啟動並執行核心稱為系統核心或原核心,新裝載啟動並執行核心稱為轉儲捕捉的核心或裝載核心或新核心。
在重啟動過程中,原核心的記憶體映像被儲存下來,並且轉儲捕捉的核心(新裝載的核心)可以訪問轉儲的映像。使用者可以使用命令cp和scp將記憶體映射拷貝到一個本地硬碟上的轉儲檔案或通過網路拷貝到遠端電腦上。
當前僅x86, x86_64, ppc64和ia64構架支援kdump和kexec。
當系統核心啟動時,它保留小部分記憶體給轉儲(dump)捕捉的核心,確保了來自系統核心正進行的直接記憶體存取(Direct Memory Access:DMA)不會破壞轉儲捕捉的核心。命令kexec –p裝載新核心到這個保留的記憶體。
在崩潰前,所有系統核心的核心映像編碼為ELF格式,並儲存在核心的保留地區。ELF頭的開始物理地址通過參數elfcorehdr=boot傳遞到轉儲捕捉的核心。
通過使用轉儲捕捉的核心,使用者可以下面兩種方式訪問記憶體映像或舊記憶體:
(1)通過/dev/oldmem裝置介面,捕捉工具程式能讀取裝置檔案並以原始流的格式寫出記憶體,它是一個記憶體原始流的轉儲。分析和捕捉工具必須足夠智能以判斷尋找正確資訊的位置。
(2)通過/proc/vmcore,能以ELF格式檔案輸出轉儲資訊,使用者可以用GDB(GNU Debugger)和崩潰調試工具等分析工具調試轉儲檔案。
(3)建立快速重啟動機制和安裝工具
1)安裝工具kexec-tools
可以下載原始碼編譯安裝工具kexec-tools。由於工具kexec-tools還依賴於一些其他的庫,因此,最好的方法是使用命令"yum install kexec-tools"從網上下載安裝並自動解決依賴關係。
2)編譯系統和轉儲捕捉的核心
可編譯獨立的轉儲捕捉核心用於捕捉核心的轉儲,還可以使用原系統核心作為轉儲捕捉核心,在這種情況下,不需要再編譯獨立的轉儲捕捉核心,但僅支援重定位核心的構架才可以用作轉儲捕捉的核心,如:構架i386和ia64支援重定位核心。
對於系統和轉儲捕捉核心來說,為了開啟kdump支援,核心需要設定一些特殊的配置選項,下面分別對系統核心和轉儲捕捉核心的配置選項進行說明:
系統核心的配置選項說明如下: 在菜單條目"Processor type and features."中開啟選項"kexec system call",使核心編譯安裝kexe系統調用。設定檔.config產生語句"CONFIG_KEXEC=y"。 在菜單條目"Filesystem"->"Pseudo filesystems."中開啟選項"sysfs file system support",使核心編譯安裝檔案系統sysfs.設定檔.config產生語句"CONFIG_SYSFS=y"。 在菜單條目"Kernel hacking."中開啟選項"Compile the kernel with debug info ",使核心編譯安裝後支援調試資訊輸出,產生偵錯符號用於分析轉儲檔案。設定檔.config產生語句"CONFIG_DEBUG_INFO=Y"。
轉儲捕捉核心配置選項(不依賴於處理器構架)說明如下: 在菜單條目"Processor type and features"中開啟選項"kernel crash dumps",設定檔.config產生語句" CONFIG_CRASH_DUMP=y"。 在菜單條目"Filesystems"->"Pseudo filesystems"中開啟選項"/proc/vmcore support",設定檔.config產生語句"CONFIG_PROC_VMCORE=y"。
轉儲捕捉核心配置選項(依賴於處理器構架i386和x86_64)說明如下: 在處理器構架i386上,在菜單條目"Processor type and features"中開啟高端記憶體支援,設定檔.config產生語句"CONFIG_HIGHMEM64G=y"或"CONFIG_HIGHMEM4G"。 在處理器構架i386和x86_64上,在菜單條目"rocessor type and features"中關閉對稱式多處理器支援,設定檔.config產生語句"CONFIG_SMP=n"。如果設定檔中的設定為"CONFIG_SMP=y",則可在裝載轉儲捕捉核心的核心命令列上指定"maxcpus=1"。 如果想構建和使用可重定位核心,在菜單條目"rocessor type and featuresIf"中開啟選項"Build a relocatable kernel",設定檔.config產生語句"CONFIG_RELOCATABLE=y"。 在菜單"Processor type and features"下的條目"Physical address where the kernel is loaded"設定合適的值用於核心裝載的物理地址。它僅在開啟了"kernel crash dumps"時出現。合適的值依賴於核心是否可重定位。
如果設定了值"CONFIG_PHYSICAL_START=0x100000",則表示使用可重定位核心。它將編譯核心在物理地址1MB處,核心是可重定位的,因此,核心可從任何物理地址運行。Kexec BootLoader將裝載核心到用於轉儲捕捉核心的核心保留地區。
否則,將使用啟動參數"crashkernel=Y@X"指定第二個核心保留核心地區的開始地址,其中,Y表示記憶體地區的大小,X表示保留給轉儲捕捉核心的記憶體地區的開始地址,通過X為16MB (0x1000000),因此使用者可設定"CONFIG_PHYSICAL_START=0x1000000"。
在配置完核心後,編譯和安裝核心及核心模組。
3)擴充的crashkernel文法
在系統核心的啟動命令列選項中,通常文法"crashkernel=size[@offset]"對於大多資料配置已夠用了,但有時候保留的記憶體依賴於系統RAM。此時可通過擴充的crashkernel命令列對記憶體進行 限制避免從機器上移去一部分核心後造成系統不可啟動。擴充的crashkernel文法列出如下:
crashkernel=<range1>:<size1>[,<range2>:<size2>,...][@offset]
其中,range=start-[end]。
例如:crashkernel=512M-2G:64M,2G-:128M,含義為:如果記憶體小於512M,不設定保留記憶體,如果記憶體為512M到2G之間,設定保留記憶體地區為64M,如果記憶體大於128M,設定保留記憶體地區為128M。
4)啟動進入系統核心
必要時更新BootLoader。然後用參數"crashkernel=Y@X"啟動系統核心,如:crashkernel=64M@16M,表示告訴系統核心保留從物理地址0x01000000 (16MB)開始的64MB大小給轉儲捕捉核心使用。通常x86和x86_64平台設定"crashkernel=64M@16M",ppc64平台設定"crashkernel=128M@32M"。
5)裝載轉儲捕捉核心
在啟動進入系統核心後,需要裝載轉儲捕捉核心。根據處理器構架和對應檔的類型(可否重定位),可以選擇裝載不壓縮的vmlinux或壓縮的bzImage/vmlinuz核心映像。選擇方法說明如下:
對於i386和x86_64平台: 如果核心不是可重定位的,使用vmlinux。 如果核心是可重定位的,使用bzImage/vmlinuz。
對於ppc64平台: 使用vmlinux。
對於ia64平台: 使用vmlinux或vmlinuz.gz。 如果使用者使用不壓縮的vmlinux映像,那麼使用下面的命令裝載轉儲捕捉核心:
kexec -p <dump-capture-kernel-vmlinux-image> \ --initrd=<initrd-for-dump-capture-kernel> --args-linux \ --append="root=<root-dev> <arch-specific-options>"
如果使用者使用壓縮的bzImage/vmlinuz映像,那麼使用下面的命令裝載轉儲捕捉核心:
kexec -p <dump-capture-kernel-bzImage>\
--initrd=<initrd-for-dump-capture-kernel> \
--append="root=<root-dev> <arch-specific-options>"
注意:參數--args-linux在ia64平台中不用指定。
下面是在裝載轉儲捕捉核心時使用的構架特定命令列選項: 對於i386, x86_64和ia64平台,選項為"1 irqpoll maxcpus=1 reset_devices"。 對於ppc64平台,選項為"1 maxcpus=1 noirqdistrib reset_devices"。
在裝載轉儲捕捉核心時需要注意的事項說明如下: 預設設定下,ELF頭以ELF64格式儲存,以支援多於4GB核心的系統,在i386上,kexec自動檢查物理RAM尺寸是否超過4GB限制,如果沒有超過,使用ELF32。因此,在非PAE系統上ELF頭總是使用ELF32格式。 選項--elf32-core-headers可用於強制產生ELF32頭,這是必要的,因為在32位系統上,GDB當前不能開啟帶有ELF64頭的vmcore檔案。 在轉儲捕捉核心中,啟動參數irqpoll減少了由於共用中斷引起的驅動程式初始化失敗。 使用者必須以命令mount輸出的根裝置名稱的格式指定<root-dev>。 啟動參數"1"將轉儲捕捉核心啟動進入不支援網路的單一使用者模式。如果使用者想使用網路,需要設定為3。 通常不必讓轉儲捕捉核心以SMP方式運行。因此,通常編譯一個單CPU轉儲捕捉核心或裝載轉儲捕捉核心時指定選項"maxcpus=1"。
6)核心崩潰時觸發核心啟動
在裝載轉儲捕捉核心後,如果系統發生崩潰(Kernel Panic),系統將重啟動進入轉儲捕捉核心。重啟動的觸發點在函數die(), die_nmi()和sysrq處理常式(按ALT-SysRq-c按鍵組合)。
下麵條件將執行一個崩潰觸發點: 如果檢測到硬體鎖住,並且配置了"NMI watchdog",系統將調用函數die_nmi()啟動進入轉儲捕捉核心。 如果調用了函數die(),並且該線程的pid為0或1,或者在中斷上下文中調用die(),或者設定了panic_on_oops並調用了die(),系統將啟動進入轉儲捕捉核心。 在powerpc系統,當一個軟複位產生時,所有的CPU調用die(),並且系統將啟動進入轉儲捕捉核心。 為了測試目的,使用者可以使用"ALT-SysRq-c","echo c > /proc/sysrq-trigger"觸發一個崩潰,或者寫一個核心模組強制核心崩潰。
7)寫出轉儲檔案
在轉儲捕捉核心啟動後,可用下面的命令寫出轉儲檔案:
cp /proc/vmcore <dump-file>
使用者還可以將轉儲記憶體作為裝置/dev/oldmem以線性原始流視圖進行訪問,使用下面的命令建立該裝置:
mknod /dev/oldmem c 1 12
使用命令dd拷貝轉儲記憶體的特定部分,拷貝整個記憶體的命令列出如下:
dd if=/dev/oldmem of=oldmem.001
8)轉儲檔案分析
在分析轉儲映像之前,使用者應重啟動進入一個穩定的核心。使用者可以用GDB對拷貝出的轉儲進行有限分析。編譯vmlinux時應加上-g選項,才能產生調試用的符號,然後,用下面的命令調試vmlinux:
gdb vmlinux <dump-file>
SysRq魔術按鍵組合列印核心資訊
SysRq"魔術按鍵組合"是一組按鍵,由鍵盤上的"Alt+SysRq+[CommandKey]"三個鍵組成,其中CommandKey為可選的按鍵。SysRq魔術按鍵組合根據按鍵組合的不同,可提供控制核心或列印核心資訊的功能。SysRq魔術按鍵組合的功能說明如表1所示。 表1 SysRq按鍵組合的功能說明
| 鍵名 |
功能說明 |
| b |
在沒有同步或卸載硬碟的情況下立即啟動。 |
| c |
為了擷取崩潰轉儲執行kexe重啟動。 |