用qemu+gdb tcp server+CDT調試linux內核啓動-起步
說明: 環境信息與 用virtualbox+模擬串口+CDT調試linux內核 TCP IP協議棧-起步 提到的同樣,而且本文中會有不少個步驟與之相同,請參考。java
S1. 開發機:我是將一個老的索尼的筆記本裝了Ubuntu桌面版本做爲開發環境,版本號是Ubuntu 16.04.4 LTS,後面在某些步驟中也會稱之爲host。
S2. JDK使用的是java version "1.7.0_80"。 官網也有下載。後面CDT開發工具要用。
S3. Eclipse版本 Mars.2 Release (4.5.2),CDT(8.8.1)使用的插件的方式安裝的。 相關軟件在eclipse官網都可以得到。至於怎麼裝插件,請網上搜索。
S4. 開發機安裝build工具鏈。linux
sudo apt-get install gcc sudo apt-get install build-essential
S5. 開發機安裝qemu sudo apt-get install qemu
建立虛擬磁盤
建立rootfsgit
dd if=/dev/zero of=rootfs.img bs=1M count=10 mkfs.ext3 rootfs.img mkdir rootfs sudo mount -t ext3 -o loop rootfs.img rootfs cd rootfs/ sudo mkdir dev proc sys
S6. 編譯安裝busybox到rootfs
```shell
cd ~
mkdir 04.busybox
cd 04.busybox/
wget https://busybox.net/downloads/busybox-1.25.1.tar.bz2
tar -xjvf busybox-1.25.1.tar.bz2
cd busybox-1.25.1github
make menuconfig
配置編譯採用靜態連接
BusyboxSettings->Build options->BuildBusybox as a static binary
sudo make install CONFIG_PREFIX=/home/simon/005.vm/01.qemu/rootfs
cd 005.vm/01.qemu
sudo umount rootfs
```shellshell
S7. 在開發機上準備內核代碼。
到內核官網下載你要用的內核,個人用的是[4.4.19]版本(https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.19.tar.gz)。能夠用wget xxx內核連接地址的辦法下載,個人是:
```shell
cd ~
mkdir 004.code
cd 004.code
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/linux-4.4.19.tar.gz
tar -xzvf linux-4.4.19.tar.gz
cd linux-4.4.19app
S8. 在開發機上準備編譯安裝內核。
修改Makefile文件(linux-4.4.19目錄下),將其中的O2字樣修改爲O1,目前不支持O0編譯。可是有個文章說能夠經過修改內核代碼達到使用O0編譯的目的。我試了試,沒成功。若是誰成功了,能夠告訴我,謝謝。
安裝必要的依賴:eclipse
sudo apt-get install libncurses5-dev sudo apt-get install libssl-dev sudo apt-get install bc
調試目標機安裝build工具鏈。tcp
sudo apt-get install gcc sudo apt-get install build-essential
配置內核選項,其實只須要執行這步生成config文件,配置項不用修改,咱們要的都有。工具
make menuconfig
而後選擇 exit 而後選擇yes 生成config文件。oop
make CONFIG_DEBUG_SECTION_MISMATCH=y -j2
此步驟須要很長時間,2-5小時不等,正常能夠在睡覺前執行,次日早上起來看結果。
編譯成功後,在你的linux-4.4.19目錄/arch/x86_64/boot/bzImage 這個文件,後面啓動會用
S9. 驗證
qemu-system-x86_64 -kernel 004.code/linux-source-4.4.19/arch/x86_64/boot/bzImage -hda ~/005.vm/01.qemu/rootfs.img -append "root=/dev/sda"
能成功啓動便可。
S10. 建立CDT工程
打開裝了CDT插件的eclipse。
window-->preferences-->General-->Workspace 去掉勾選 Build Automatically。
window-->preferences-->C/C++-->indexer 去掉勾選 Enable indexer。
file-->new-->c project-->project name填寫你本身合意的,好比linux-kernel-study / 去掉use default location,location輸入框中選擇你的linux-4.4.19路徑。 / project type 選擇 Makefile project-Empty project / Toolschains選擇Linux GCC-->next-->Advanced Setting-->C/C++ Build-->去掉勾選use default build command, build command輸入框內寫上 make CONFIG_DEBUG_SECTION_MISMATCH=y -j2,build directory選擇你的linux-4.4.19路徑。 / Behavior頁籤 Build(Increament build) 輸入框中輸入一個空格便可。而後完成工程建立便可。
點擊工具欄中的綠色小蟲子右邊的箭頭,選擇Debug Configurations-->C/C++ Remote Application(雙擊)-->proiect選擇你剛建立的project / C/C++ Application選擇你的linux-4.4.19路徑下的vmlinux。 / 選中 Disable auto build 點擊select other換一個啓動器 選擇 GDB(DSF)Manual Remote Debugging...
點擊debugger頁籤 stop on startup at 填寫start_kernel,點擊connection子頁籤,type選擇TCP,hostname填寫localhost,prort number填寫1234 。此處標誌爲待填13.1。
點擊apply close便可。
S11. 修復GDB問題
後面步驟用gdb遠程調試時會報錯: Remote ‘g’ packet reply is too long
先看下您的gdb的版本,而後下載相同版本進行修復並並編譯。
gdb -version wget http://ftp.gnu.org/gnu/gdb/gdb-7.11.1.tar.gz tar -xzvf gdb-7.11.1.tar.gz cd gdb-7.11.1 vi gdb/remote.c
將下面兩行註釋掉
// if (buf_len > 2 * rsa->sizeof_g_packet) // error (_("Remote 'g' packet reply is too long: %s"), rs->buf);
sudo ./configure sudo make sudo make install
S12. 啓動調試目標機並調試
qemu-system-x86_64 -s -S -kernel 004.code/linux-source-4.4.19/arch/x86_64/boot/bzImage -hda ~/005.vm/01.qemu/rootfs.img -append "root=/dev/sda"
cd 你的linux-4.4.19路徑
gdb vmlinux
target remote localhost:1234
此時就應該鏈接上目標機器了。
b start_kernel
按gdb的c指令即可以使得調試目標機繼續啓動下去。
執行到內核啓動時,斷點便會被命中。
S13. 在開發機用CDT調試。 從新啓動調試目標機,此次不用gdb命令行的方式,用CDT可視化界面。 點擊CDT工具欄中的綠色小蟲子右邊的箭頭,選擇1New_configuration,若是有什麼錯誤提示不用理會,繼續proceed。 鏈接成功後,控制檯會有輸出,也能夠在控制檯輸入gdb調試指令,也能夠在CDT上直接加斷點。 這時你會發如今 start_kernel處停了下來。 F5 F6這些快捷鍵均可以用。