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 用のスタブを見ていく。