C/C++mikanOS書籍

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

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

コメント

タイトルとURLをコピーしました