デバッガの理論と実装

今さらながらに読んだ。

http://www.hondana.org/shinichiro.h/4756117457.html

面白かった。でももう少し薄くしてくれても良かったんじゃないかとか。この本の読者であればそんな詳細な説明はいらなかろう、というアルゴリズムが詳説されてたりしたので。

私的に要点だと思ったのは、

  • デバッガの実装にはOSやらコンパイラのサポートが不可欠
  • ブレークポイントは件の個所を割込み命令に書き換えて実現
  • ウォッチポイントは件の個所にメモリ保護をかけて実現

という3点。以下その応用やらで面白かったこと。

デバッグ情報のある部分から、デバッグ情報の無い関数に入りその中からまたデバッグ情報がある関数がコールバックで呼ばれる場合の、ステップ実行。 a() => b() => c() と呼ばれて、 a と c はデバッグ情報がある場合、 a() 内のステップ実行は c() の最初で止まって欲しい。でもデバッガには c() の開幕で止まるべきと知る方法が無い。どうするか。デバッグ情報のあるコード全てにメモリ保護をかけるそうな。

最適化されたコードのデバッグは極めて難しい。どうしようもないと言っていいくらい。スレッドも大変。巻末の「将来のトレンド」という項はほとんど現代でも実現されてないんじゃなかろうか。分散オブジェクトとか。97年の本らしいが。

あなたがデバッガのバグだと思ったものの多くはコンパイラのバグだ。デバッガ屋はがんばってるんだ。OS屋もコンパイラ屋もデバッガのこと考えるのは後回しにするからひどいやひどいや…

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h