qemu上のmikanOSをgdbでデバッグする方法

· 更新 2021.11.17

qemu上のmikanOSにgdbを接続してデバッグする方法を備忘録として残しておきます

qemu上のmikanOSをgdbでデバッグする方法

gdbをqemuに接続

gdbを接続するためにqemuの起動オプションに-s -Sをつけます。 -sは-gdb tcp::1234の意味は意味です。 -Sはデバッガからコマンドを受け取るまでCPUを起動させないオプションです。 mikanos/build.shからmikanOSを起動している場合osbook/devenv/run_image.shでqemuを 起動しているのでrun_image.shを編集してください。

mikanOSを起動したらgdbを起動してqemuに接続します。 以下シェルのプロンプトを’$’、gdbのプロンプトを’(gdb)‘として表示します。

$ gdb
(gdb) target remote localhost:1234

gdbの表示設定

逆アセンブル結果をintel形式に設定
(gdb) set disassembly-flavor intel
ブレークするごとにその後の5命令を表示するように設定
(gdb) disp/5i $pc
ブレークするごとにフラグレジスタの値を表紙するよに設定
(gdb) disp $eflags
その他目的に応じてお好みの表示設定をしてください

ブレークポイントの設置

まず、ブレークポイントを関数名、シンボル名で設置できるようにkernel.elfをgdbに読み込みます。 アプリのデバッグをしたい場合はkernel.elfではなくそのアプリのelfファイルを読み込みます。
(gdb) file /path/to/kernel.elf
以下のように聞かれるのでyと入力してください。
A program is beging debagged already.
Are you sure you want to change the file? (y or n)
ブレークポイントを設置するのは'b'コマンドです。 hogeにはシンボル名や関数名を入れます。
(gdb) b hoge
アドレスを直接指定してブレークポイントを設置する場合は以下のようにします。
(gdb) b *0x88888

デバッグ

ブレークポイントを設置したらqemuを動かします。
(gdb) c
cはcontinueの短縮形です。次のブレークポイントまでqemuを動かします。

ステップ実行したい場合はsiコマンドを実行します。

(gdb) si

ブレークポイントでブレークしたら色々な情報を表示してデバッグします。

バックトレース

(gdb) bt

変数hoge

(gdb) p hoge

ポインター変数pの指す内容

(gdb) p *p

ポインターのポインター変数ppの指す内容

(gdb) p **p

レジスタfoo

(gdb) p $foo

現在のフレーム

(gdb) info frame 0

n個前のフレーム(nが大きくなるほど古いフレーム)

(gdb) info frame n

参考文献

[1] 「os自作入門のhelloosをステップ実行する(1)その準備編」 https://nagaragawa-r.com/os-selfmade-step-execution/

[2] 「helloosをステップ実行する(2)実行編」 https://nagaragawa-r.com/os-selfmade-step-execution2/

[3] 「QEMUにGDBを繋げてhariboteOSをデバッグする方法」 https://yuyubu.hatenablog.com/entry/2018/07/17/QEMU%E3%81%ABGDB%E3%82%92%E7%B9%8B%E3%81%92%E3%81%A6hariboteOS%E3%82%92%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95

[4] 「gdb でコード解析、デバッグするときによく使うコマンドまとめ」 https://nodachisoft.com/common/jp/article/jp000028/

[5] 「gdbでスタックフレームを見てみる」 https://foxtrot0304.hatenablog.com/entry/2016/04/05/132726