VirtualBoxでLinuxカーネルのデバッグ環境を作る

概要

VirtualBoxに2台の仮想マシンを用意しシリアルポートをクロス接続することで、gdbをシリアルポート経由でリモートアタッチしデバッグを行う。

環境

  • Mac OSX 10.11.4
  • VirtualBox 5.0.16
  • CentOS7(ゲストOS)

VirtualBoxのインストール

公式サイトダウンロードページからダウンロードしてきてインストールする。自分の場合はOSX用。

仮想マシンのインストール

CentOSのダウンロードサイトからCentOS7のISOイメージをダウンロードしてきてDebuggee(デバッグされる側)とDebugger(デバッグする側)の2台の仮想マシンを作成する。
virualbox

仮想マシンのシリアルポートをクロス接続する

VirtualBoxの設定画面で2台の仮想マシンのシリアルポートを有効にする
serial

ターミナルを開いてVirtualBoxの管理コマンドでシリアルポートをクロス接続する。この設定をするとserver側のVMを先に立ち上げておかないとエラーになるので注意。

gdbとkernel-debuginfoのインストール

Debuggerにログインし以下のコマンドを実行し、kernel-debuginfoとgdbをインストール

kernelオプションの変更

Debuggeeのカーネルオプションをシリアルデバッグ用に変更する。/etc/defaults/grubを開きGRUB_CMDLINE_LINUXにkgdboc=ttyS0,115200 kgdbwaitを追加。
grub

以下のようにgrub2-mkconfigコマンドを実行してgrubに設定を反映させる。

再起動するとgdbからの接続待ちになる。
gdbwait

gdbで接続

以下のコマンドでDebuggerのgdbからデバッグする

debugging

gdbをつないだ直後はdo_one_initcall関数で止まるようだ。起動直後のstart_kernel関数からデバッグしたい場合はどうすればいいんだろうか…

TODO

Ctrl-cでgdbから割り込みができないのをなんとかしたい。いったんcontinueしたら、Debuggee側でecho g >/proc/sysrq-triggerしないとgdbの操作ができなくなる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です