一、環(huán)境準(zhǔn)備
-
centos操作系統(tǒng),并安裝VirtualBox虛擬機(jī),虛擬機(jī)使用ubuntu 14.04 desktop -
centos上安裝socat -
linux 3.10.1源碼包 下載地址 -
虛機(jī)上可能要安裝一些包 :[參考](apt-get install libncurses5-dev libssl-dev bison flex libelf-dev gcc make openssl libc6-dev)
PS. 針對(duì)想調(diào)試的kernel版本選擇虛擬機(jī)系統(tǒng)版本,盡量讓兩者版本接近,否則會(huì)因?yàn)?code>gcc版本造成一系列編譯錯(cuò)誤
二、在虛擬機(jī)上編譯linux kernel
- 在源碼根目錄,通過
make menuconfig,配置編譯選項(xiàng)。為了支持kgdb需要勾選kernel hacking等,具體可以參考config配置參考1 config配置參考2。針對(duì)特定學(xué)習(xí)和測試場景,需要勾選一些其他配置,如默認(rèn)是沒有勾選ext2和ext3的,若想調(diào)試ext2則需要勾選它。 make -j8-
make bzImage,假如出現(xiàn)幺蛾子1,盡量換個(gè)和虛擬機(jī)系統(tǒng)版本接近的linux版本,避免浪費(fèi)時(shí)間 make modulesmake modules_install-
make install
搞定后,重啟虛擬機(jī)
三、調(diào)試前的準(zhǔn)備
- 虛擬機(jī)中更改
grub文件配置
因?yàn)槲覀冃枰褂胟gdb進(jìn)行調(diào)試,所以需要在啟動(dòng)的時(shí)候多向kernel傳入兩個(gè)參數(shù),所以需要更改配置文件。
ubuntu下,文件位于/etc/default/grub,需要root權(quán)限進(jìn)行編輯。
在GRUB_CMDLINE_LINUX_DEFAULT選項(xiàng)后面增加kgdboc=ttyS0,115200 kgdbwait,我的這個(gè)選項(xiàng)最終變成了這樣:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash kgdboc=ttyS0,115200 kgdbwait"
然后保存, 更新grub,執(zhí)行update-grub2重啟,如果一切正常,你會(huì)發(fā)現(xiàn)啟動(dòng)卡住了,顯示等待connection from remote gdb。
————————————————
版權(quán)聲明:本文為CSDN博主「Anciety」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_29343201/article/details/73909928
- 將在虛擬機(jī)上編譯好的
linux kernel完整拷貝到主機(jī)的某個(gè)目錄,如/home/teeth/debug_u14_linux3-10/linux-3.10.1 - 配置虛擬機(jī)的串口(
kgdb需要主機(jī)通過串口和虛擬機(jī)通信)。虛擬機(jī)中不需要?jiǎng)?chuàng)建/tmp/serial文件。
image.png
四、調(diào)試
- 啟動(dòng)虛擬機(jī)(注意選擇為自己編譯的內(nèi)核),然后虛擬機(jī)會(huì)卡在
kgdb界面(如果剛啟動(dòng)就卡住,沒有進(jìn)入選擇內(nèi)核界面,關(guān)掉重啟就行了,自己環(huán)境各一次就遇到這種情況,不知道為啥會(huì)這樣,不過重啟很有效)
image.png - 主機(jī)上開個(gè)終端,執(zhí)行
socat -d -d /tmp/serial pty,根據(jù)實(shí)際情況得到PTY is /dev/pts/2
image.png - 主機(jī)上再開一個(gè)終端,
cd到主機(jī)的/home/teeth/debug_u14_linux3-10/linux-3.10.1,執(zhí)行gdb ./vmlinux再輸入target remote /dev/pts/2。這個(gè)終端用來調(diào)試,此時(shí)斷在了kgdb。調(diào)試方法就是gdb,c,然后虛擬機(jī)就正常啟動(dòng)進(jìn)入了gui。 - 如果需要再次斷在調(diào)試終端,需要在虛擬機(jī)執(zhí)行:
echo "g" > /proc/sysrq_trigger。這樣控制權(quán)就又交給了調(diào)試終端??梢栽谡{(diào)試終端設(shè)置斷點(diǎn),進(jìn)行調(diào)試了。


