通過KGDB進行雙機核心除錯
原理
原理結構圖
原理過程
Kgdb是雙機線上除錯,一端是Host端(linux),執行GDB,另一端是Target端,執行帶Kgdb的linux核心。
兩邊通過串列埠(KGDBoc)或網路口(KGDBoE)相連線,kgdb實現了遠端除錯的功能,主要部件有:
stub
stub可卸任是一個執行在target端的代理,它負責與遠端的Host端進行溝通,接收Host端發來的指令。
應用場景
如上面原理圖所示,常常用於嵌入式開發場景中,開發板作為target端,執行開啟Kgdb的核心 ,PC機作為Host端,執行GDB,用來遠端除錯Target端的核心。
核心配置
在核心2.6.26版本之前,Kgdb是以Patch的方式提供,要使用它需要經過複雜的配置過程,並且容易出錯,之後,就整合到了核心中,只需要開啟相關配置項即可使用了。
這裡,我們以核心 4.4.19為例,KGDB的配置如下:
Kernel hacking --->
[*] KGDB: kernel debugger --->
[ ] KGDB: internal test suite
[*] KGDB: Allow debugging with traps in notifiers
[*] KGDB_KDB: include kdb frontend for kgdb
DEBUG相關配置:
Kernel hacking --->
Compile-time checks and compiler options --->
[*] Compile the kernel with debug info
例項:利用virtualBox(ubuntu14.04) 使用Kgdb進行模擬雙機除錯
環境:
- Host:deepin 15.2(64Bit)
- Target:virtualbox(Ubuntu14.04_64bit)
- 連線方式:虛擬串列埠
結構圖
準備工作
- 設定虛擬串列埠
- 在虛擬機器中執行開啟KGDB的核心
這裡,為了方便測試KGDB,直接使用原始碼中自帶的arch/x86/configs/x86_64_defconf
執行
make x86_64_defconf
然後再執行 :
make menuconfig
參考上面開啟KGDB和DEBUG相關的核心配置項。
編譯帶有除錯資訊的核心
make-kpkg --initrd --revision 001.magc --append-to-version -20160901 kernel_debug kernel_image kernel_headers
注:這裡kernel_debug和kernel_image要同時有,因為它們產生的deb有依賴關係。
編譯成功後,會看到生成三個deb包,並使用dpkg 命令將它安裝上去。
另外,還要將此原始碼和產物,放到HOST裡面一份。
- 修改Guest OS的Grub啟動引數
在Guset OS中修改/boot/grub/grub.cfg
找到當前系統使用的核心啟動命令列,在後面新增:
kgdboc=ttyS0 115200 kgdbwait
注:
- kgdboc:是指KGDB over console 使用波特率為115200的ttyS0.
- kgdbwait:是讓kernel一直等等待直到連上GDB為止。
- 新增此引數後,需要重啟系統來啟用這些引數。
- 在HOST中使用socat來連線虛擬串列埠的命名管道檔案
# socat -d -d /home/magc/workspace/vmserial PTY
注:
- PTY:是一種pseudo-terminal
- /home/magc/workspace/vmserial:是虛擬串列埠在HOST上的命名管道檔案
- 當執行此命令後,終端進入等待狀態,如下圖示:
如上所示,得到的pseudo-terminal的裝置名是/dev/pts/0 ,這個程序需要在除錯過程中一直進行,並且HOST上的GDB會使用這個這裝置名
開始雙機除錯
通過上面幾步準備工作,使HOST和虛擬機器的虛擬串列埠連線起來,此時重新啟動虛擬機器。此時,虛擬機器會卡住,等等連線HOST上的GDB.
1. 啟動HOST上的GDB:
進入原始碼編譯目錄下(此原始碼目錄是從Guest OS中複製過來的),執行下面命令,啟動GDB:
# cd linux-4.4.19
# gdb ./vmlinux
(gdb) target remote /dev/pts/0
此時虛擬機器仍停止等待,當在GDB中輸入下面指令:
continue
此時虛擬機器就會繼續啟動進入系統了。
若想重新回到GDB控制,只需要在Guest OS中執行下面命令:
echo g > /proc/sysrq-trigger
此時,Guest OS就會中止當前會話,回到HOST的GDB控制中。這樣就可以增加斷點以及除錯了。
2. 除錯核心模組:
若是除錯核心的話,按上面操作方法即可滿足需求,若是想除錯某個單獨的核心模組,那就在Guest OS中安裝此模組,並拿到此模組的.text段地址(/sys/module//sections/.text) ,並在HOST的GDB中通過add-symbol-file 引數載入進來進行除錯即可。
小結
通過VirtualBox使用KGDB進行雙機除錯的主要步驟:
1. 在HOST和Guest OS之間建立虛擬串列埠連線
2. 在Guest OS裡編譯安裝帶Debug的核心,並修改Grub啟動引數
3. 在Host裡啟動GDB,並連線到虛擬串列埠上,開始雙機除錯