閱讀350 返回首頁    go 技術社區[雲棲]


用KGdb和VMware調試Linux內核,System Call

Linux的內核和System Call不好調試,參考這裏:

https://stackoverflow.com/questions/5999205/cannot-step-into-system-call-source-code

簡單來說,如果想在本機調試system call,那麼當你進入system call時,係統已經在掛起狀態了,那麼它又怎樣能響應用戶的輸入?

所以,有一個UML(https://user-mode-linux.sourceforge.net/)的方式,把內核當成一個進程啟動,這樣就可以在本機調試。

否則,隻能通過串口,或者網絡等從不同的機器來調試。

自己用KGdb和Vmware虛擬機折騰了下用串口調試Linux system call。總結一下。

編繹內核

首先,在虛擬機裏安裝好linux係統(注意把硬盤空間選擇大點),編繹帶Debug信息的內核:

先下載相關的包,及當前內核的源代碼,注意用apt-get source下載源代碼時,是放在當前目錄下的。

mkdir code
cd code
sudo apt-get dpkg-dev
sudo apt-get source linux-image-$(uname -r)
sudo apt-get install libncurses5-dev
sudo apt-get install bc
再配置編繹選項:

sudo make menuconfig
會有一個界麵,可以自己設置編繹選項。在“Kernel hacking”下,  有KGDB的選項,不過貌似默認都選好了。

執行make編繹,再執行

sudo make
make modules_install  //編繹模塊
我編繹花了3,4個小時,編繹出來竟然有11G。。

把這些編繹好的數據複製一份到宿主機上,等下調試的時候要用到。

為虛擬機配置串口

在Vmware的“Settings”,“Hardware”,點“add",選擇”Serial Port“,再”output to socket",在“Socket(named pipe)”裏,填上“/tmp/testsocket”。則虛擬機裏的串口數據會寫到/tmp/testsocket這個文件裏。


配置新內核啟動

編繹好了內核,要用新內核,最簡單的辦法是直接切換到root用戶:

make install
會自動複製vmlinuz,.config, initrd.img等文件到boot目錄下,並默認以新內核啟動。

僅以新內核啟動還不可以調試,修改/boot/grub/grub.cfg 文件,在"linux"命令下增加kgdb參數,如:

linux /boot/vmlinuz-3.13.0-24-generic root=UUID=xxx-b91d-xxx-839d-xxxxxx ro quiet kgdboc=ttyS1,115200 kgdbwait
如果隻是不想啟動時等待,可以去掉kgdbwait參數。

重啟虛擬機,可以發現停在這樣的畫麵上:


用socat來傳輸串口數據到PTS

虛擬機已經在暫停,等待我們的連接了。

先用socat來把虛擬機的串口輸出傳送到pts上(可以用man pts 查看pts的更多信息)。

用ctrl + alt + f1,進入tty1,再輸入下麵的命令:

sudo socat -d -d /tmp/testsocket PTY

如果成功的話,我們可以看到類似這樣的輸出:

successfully connected ...
PTY is /dev/pts/14

用gdb連接pts,並調試

切換到root用戶,進入到從虛擬機複製出來的編繹好的代碼目錄,執行:

gdb ./vmlinux


如果不加載vmlinux文件的話,則打不了斷點。在gdb裏再輸入

Remote debugging using /dev/pts/14
continue

然後可以看到虛擬機裏的linux開啟正常啟動了。
注意,如果是想在system call上打斷點,則要在原來函數名前加上“sys_”。如
break sys_open

在gdb裏輸入continue之後,發現沒有辦法再打斷點了,可以在虛擬機裏以root用戶執行:
echo g > /proc/sysrq-trigger

這樣就可以讓虛擬機暫停,在宿主機的gdb裏可以重新操作了。

參考:

https://www.opensourceforu.com/2011/03/kgdb-with-virtualbox-debug-live-kernel/#
https://www.eetop.cn/blog/html/21/766721-25573.html
https://blog.csdn.net/u011839461/article/details/12002075
https://wenku.baidu.com/view/baf6af3f0912a21614792996.html
https://my.oschina.net/fgq611/blog/113249
https://blog.csdn.net/star_xiong/article/details/17357821

最後更新:2017-04-03 12:56:30

  上一篇:go C# 網絡編程之通過豆瓣API獲取書籍信息
  下一篇:go UVA之11292 - Dragon of Loowater