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
コメント