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

そろそろ Monaデバッグ環境を整えないと色々大変なので GDB スタブを書く事にする。全く分かっていないので調べるところから。
正月休みくらいに動くようになると良いな。

目的

達成したいのは Mona 中のユーザープロセスのデバッグ。ユーザープロセスが出来れば Kernel は簡単だと思う。
特にユーザープロセスが死んだときにソースコード上のどこで死んだかが GDB 一発で分かるようにしたい。

仕組み

マニュアルを読みつつ箇条書きで。

  • GDB と Remote は Serial ポートや、TCP, UDP などで通信を行う
  • Remote 側は GDB スタブを実装する
  • sparc-stub.c が一番まとまっているので参考になる
  • Stub 構成
    • int getDebugChar(): serial port から char を読み出す。
    • void putDebugChar(int): seri port に char を書き出す。
    • void exceptionHandler (int exception_number, void *exception_address): 386 では interrupt gate として実装する必要があり。実行中はマスクが必要。
    • void flush_i_cache(): sparc と sparcliteだけ。
    • handle_exception: trap が発生したときに自動的に呼ばれる。この関数が GDB と種々の情報をやりとりをしてデバッグを実現する
    • breakpoint: よく分からない。あとで戻ってくる。

次回

実際に i386 用のスタブを見ていく。