對使用者態程序,利用gdb除錯**是很方便的手段。而對於核心態的問題,可以利用crash等工具基於coredump檔案進行除錯。其實我們也可以利用一些手段對linux核心**進行gdb除錯,qemu就是一種。qemu是一款完全軟體模擬(binary translation)的虛擬化軟體,在虛擬化的實現中效能相對較差。但利用它來在測試環境中gdb除錯linux核心**,是熟悉linux核心**的乙個好方法。本文旨在介紹怎麼利用qemu搭建linux的gdb除錯環境。其中主要包括了如何編譯linux核心,如何利用gdb遠端連線qemu啟動的gdbserver,進而進一步進行核心**除錯。
編譯選項不同的架構有不同的預設檔案,比如x86平台,可以在arch/x86/configs找到相關檔案:i386_defconfig。通過執行make i386_defconfig 即可基於這個檔案生成.config檔案,在此基礎上可以再執行make menuconfig 來進行個別的調整。更多的細節請參考:documentation\kbuild\kconfig.txt。 總之,無論怎麼配置,最終都是為了生成.config檔案。這些巨集最終將影響makefile中參與編譯的檔案。
**的編譯選項配置很多,這裡主要做如下兩處配置:
# make注意:預設make menuconfig會報錯如下,因為最小系統不支援圖形顯示。i386_defconfig //32位架構
# make menuconfig // 調整編譯選項
# make解決方法:menuconfig
hostcc scripts/kconfig/mconf.o
in file included from scripts/kconfig/mconf.c:23:0
:scripts/kconfig/lxdialog/dialog.h:38:20: fatal error: curses.h: no such file
or directory
#include curses_loc
^compilation terminated.
# apt-get install libncurses5-dev -y在核心編譯選項中,開啟如下"compile the kernel with debug info"
kernel hacking --->
compile-time checks and compiler options --->
[ ] compile the kernel with debug info
示意圖如下,利用鍵盤選中debug選項,然後敲"y"勾選:
在menuconfig中選完編譯選項,結果會寫入到.config檔案中。可以看到.config檔案的config_debug_info被設定成y。
編譯
編譯選項選完後,利用make編譯,編譯需要較長時間。
# make -j2編譯完成之後,會有一些新的檔案產生,如:
安裝qemu
# apt-get updateqemu主要選項解釋:# apt-get install
qemu
# 因為用的32位平台環境,所以用下面的qemu
# ln -s /usr/bin/qemu-system-i386 /usr/bin/qemu
利用qemu啟動編譯好的核心,如下:
console=ttys0
" -nographic
在本機另乙個terminal利用gdb連線本地的gdbserver 1234埠
# gdb在繼續執行後,最終qemu的輸出如下,在qemu虛擬機器裡執行的linux系統能成功啟動,並且最終以kernel panic宣告結束。看到call trace打出來的是在initrd_load的時候出錯,原因很簡單,因為啟動系統的時候只指定了bzimage,沒有指定initrd檔案,系統無法mount上initrd (init ram disk) 及其initramfs檔案系統。# (gdb)
file linux-3.18.6/vmlinux //load linux符號表
reading symbols from linux-3.18.6/vmlinux...done
.# (gdb) target remote:
1234 //遠端連線監聽在tcp 1234的gdb server
(gdb) break start_kernel //在start_kernel函式設定斷點
breakpoint
1 at 0xc1a2f7c5: file init/main.c, line 501
.(gdb) c //continue,繼續執行**
到此為止,gdb除錯linux核心**的基本環境已經搭建完成,可以利用斷點來除錯啟動啟動中的細節。後面將介紹如何構建initramfs檔案系統,能讓qemu執行的linux系統更像「完整的系統」。
IDA除錯QEMU修復除錯環境
本篇文章是按照家用路由器裡面的內容來敘述的.在目錄 my file dir605l fw 113.bin.extracted squashfs root 0 下 執行cp which qemu mips 而後執行命令 sudo chroot qemu mips bin boa 注意 書上是有錯誤的,...
在NS2中用GDB來除錯
我想對於用ns來 的人來說,很重要的乙個問題就是除錯,因為並沒有像vc那樣方便的整合的除錯環境。ns與網路模擬 的書中介紹了tcl debug和kdevelop除錯的方法,這裡主要介紹gdb除錯的方法。因為偶個人第一次寫ns 除錯用的就是gdb,感覺安裝使用都很方便,這裡簡單介紹一下 2.修改mak...
利用Qemu搭建核心除錯環境
一 核心除錯的原理 傳統除錯核心需要配置兩台linux主機,其中一台主機稱為開發機,另一台主機稱為目標機。開發機中除了有乙個可執行的linux環境,還應包含必要的開發環境 gcc gdb make等 以及核心原始碼,目標機則需要能夠啟動核心並掛載乙個有效的檔案系統,可以將執行在目標機中待除錯核心稱為...