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:1234gdbの表示設定
逆アセンブル結果を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) ccは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 0n個前のフレーム(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