GDB スタブを書いてみよう その10

GDB スタブと Mona カーネルをうまくつないでいく。できるだけ疎結合で。

カーネルスタックの入れ替え

GDB スタブは基本的に割り込みハンドラ内で動くのでカーネルスタックを利用するのだが、間違いが起きないように handle_exception の呼び出し前にカーネルスタックを入れ替えている。
新たにカーネルスタックとして利用されるのは static に確保してある大きめの領域。
この切り替えを自前で書かなくてはいけない。失敗すると再起動してしまうので注意。

メモリフォルトのチェック

GDB スタブは用心深い。GDB スタブ内のメモリ操作でメモリ関連のフォルトが起きた場合はエラーの内容を記録して正常復帰しようと試みる。
これは関数ポインタ mem_fault_routine が NULL かどうかで制御される。
MonaGDB スタブでは正常復帰は試みずエラーが起きた事を通知する事とする。

エラー種類が GDB に表示されない

ハンドラをきちんと書いたら表示された。

Program received signal SIGSEGV, Segmentation fault.
0xa00013ac in testClassMutex() ()

次の一手

  • gdbCatchException の処理共通化
  • 全ての割り込みハンドラに対応する
    • if (remote_debug)
  • 一番最初の breakpoint exception で初期化する?
  • breakpoint(), Debug.h
  • 行番号