前回の環境構築を前提にして、カーネルのソースにブレークポイントを貼って止めるところまでいきます。
gdbのインストール
sudo apt install gdb
linuxの起動、gdbと接続
wslでlinuxフォルダに入り、以下のコマンドでQEMUからdebianを立ち上げます。
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -drive file=(qcowファイルのパス),format=qcow2 -nographic -append "root=/dev/sda1 console=ttyS0" -s
最後の-sオプションが「gdbと接続する」「tcpのポート1234をlistenする」などの意味を持っているようです。(より明示的に指定するには-gdb tcp::1234などの書き方をします)1
また、起動してから即停止し、gdbからの接続を待つには上記コマンドに-S(大文字)オプションを追加します。
ここまできたら、もう一つwslを立ち上げます。スタートメニューから選んでもいいですし、windowsターミナルの三角ボタンから選んでも大丈夫です。

後で立ち上げた方をwsl「B」と呼びます。
wsl「B」でlinuxフォルダに移動し、以下のコマンドを実行します。
gdb vmlinux
...
Reading symbols from vmlinux...
(gdb) target remote:1234
(gdb) b bprm_execve
(gdb) c
vmlinuxがデバッグのためのシンボル情報で、これを読み込んだあとgdbと対話的に操作できます。
target remote:1234とすると、qemuのプロセスとtcp通信を行い、そのタイミングでQEMU側が停止します。
b (関数名)などとするとブレークポイントが貼れます。ここではプロセスをforkするときに(多分)呼び出されるbprm_execveにブレークポイントを貼る例を出しました。
cとするとcontinueします。
これでブレークポイントに止まったら成功です。
Windows側でVSCodeの利用
wsl上で、linuxフォルダで以下のコマンドを実行するとwindows上でVSCodeが立ち上がります。
code .
VSCodeに慣れている方はこれがやりやすいかもしれません。
ただ、ソースを開いてGUI上でブレークポイントを貼るには一工夫要りそうで、その方法は現状分かっていません。
わかっていないこと
- VSCodeのGUI上でブレークポイントを貼る方法
最後までお読みいただきありがとうございました。
再現した環境
(前回記事参照)
GNU gdb (Ubuntu 15.0.50.20240403-0ubuntu1) 15.0.50.20240403-git
-
QEMUのコマンドラインはこの辺を参照ください。https://www.qemu.org/docs/master/system/introduction.html
私は(なぜか?)ここにたどりつくのに結構苦労してしまいました…。 ↩