WinDbg のブレークポイント

スレッドの指定にワイルドカードを使うとプロセス内の全てのスレッドに有効なブレークポイントになる。スレッドを指定するとそのスレッドにのみ有効なブレークポイントになる。
WinDbg がこういった処理をどういう風に行っているのかが気になった。取り敢えず 2 通りの方法が在ると思うんだよね。
1 つ目は、取り敢えず全てのスレッドの実行を監視して、ブレークポイントに到達してから、そのカレントスレッドを判定するという物。ワイルドカードの場合は判定処理が強制的に TRUE になる感じ。
2 つ目は、個々のスレッドに有効なブレークポイントはその対象のスレにのみ入れられて、ワイルドカードブレークポイントは全てのスレッドに入れられるという物。
1 つ目よりも 2 つ目の方が効率が良さそうです。実際にデバッガを作る場合にこういった選択肢が本当に存在するのか俺は知りませんが。
で、2 つ目の方法を取っている場合はワイルドカードブレークポイントをなるべく使わずに個々のスレッドに有効なブレークポイントを多用する事で、ブレークポイントによる実行速度の低下を少なく出来ます。逆に 1 つ目の場合はワイルドカードブレークポイントを使った方が速度の低下が少なくなります。
この辺りを考慮して、デバッグ環境を改良してみようかと試みてみました。今まではワイルドカードブレークポイントを使っていたのですが、色々と面倒な事をやって 2 つ目の方法を使ってみました。結果、遅くなりました。まだちゃんと確かめていませんが、遅くなっていたと思います。
という事で、WinDbg は 1 つ目の方法を取っている様です。効率の悪い方法だなあ。
うろ覚えなんですけど、VC++6 はデバッグレジスタってのを使わずに、毎回止めて判定しているとかなんとか…。WinDbg もそうなのかなあ。ハードウェアの制約を受けずに沢山のブレークポイントを設定するにはそうするしか無いもんなあ。


エロビクスという単語を Google で検索したみたら、100 件以上ヒットした。だよなあ結構思い付き易いもんなあ。