用qemu+gdb tcp server+CDT調試linux內核啟動-起步
用qemu+gdb tcp server+CDT調試linux內核啟動-起步
說明: 環境信息與 用virtualbox+模擬串口+CDT調試linux內核 TCP IP協議棧-起步 提到的一樣,並且本文中會有很多個步驟與之相同,請參考。
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官網均可以獲得。至於怎麽裝插件,請網上搜索。
sudo apt-get install gcc
sudo apt-get install build-essential
S5. 開發機安裝qemu sudo apt-get install qemu
創建虛擬磁盤
創建rootfs
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.1
make menuconfig
配置編譯采用靜態鏈接
BusyboxSettings->Build options->BuildBusybox as a static binary
sudo make install CONFIG_PREFIX=/home/simon/005.vm/01.qemu/rootfs
sudo umount rootfs
```shell
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.19
S8. 在開發機上準備編譯安裝內核。
修改Makefile文件(linux-4.4.19目錄下),將其中的O2字樣修改成O1,目前不支持O0編譯。但是有個文章說可以通過修改內核代碼達到使用O0編譯的目的。我試了試,沒成功。如果誰成功了,可以告訴我,謝謝。
安裝必要的依賴:
sudo apt-get install libncurses5-dev
sudo apt-get install libssl-dev
sudo apt-get install bc
調試目標機安裝build工具鏈。
sudo apt-get install gcc
sudo apt-get install build-essential
配置內核選項,其實只需要執行這步生成config文件,配置項不用修改,我們要的都有。
make menuconfig
然後選擇 exit 然後選擇yes 生成config文件。
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這些快捷鍵都可以用。
用qemu+gdb tcp server+CDT調試linux內核啟動-起步