2010-01-08

プロセスにアタッチされているデバッガを変更する方法

The Old New Thing : How to change the debugger attached to a process

アプリケーションがクラッシュして、デバッガXが、自動的にアタッチされたとしよう。なぜなら、システムの設定がそうなっているからだ。しかし、急にデバッガYを使いたくなった。デバッガYをインストールはしてみたが、どうやって、現にアタッチされているプロセスのデバッガ、XからYに変更すればいいのだろうか。デバッガYでアタッチを試みても、STATUS_PORT_ALREADY_SETエラーコードが返るだけである。なぜならば、あるプロセスにアタッチできるデバッガは、ひとつだけだからだ。しかし、前のデバッガをデタッチしてしまうと、アプリケーションは消えてしまう。このCatch-22問題はどうやって解決すればいいのだろうか。

こうすればいい。

  • ntsdデバッガを、non-invasive モードでアタッチする。これには、-pの代わりに、-pvオプションを使って、プロセスIDを指定する。
  • ntsdデバッガは、プロセス内のスレッドをすべてサスペンドさせる。
  • ここで、デバッガXに、プロセスをレジュームさせ、デタッチする。もし、デバッガX自体がntsdならば、コマンドはpdである。
  • 次に、デバッガYをプロセスにアタッチさせる。
  • 最後に、non-invasiveモードでアタッチした、ntsdデバッガを、qdコマンドでデタッチさせる。

non-invasiveモードとは、デバッガをプロセスに、実際にはアタッチしないのだ。単に、プロセス内のすべてのスレッドをサスペンドし、メモリを覗き見るだけなのだ。そのため、元のデバッガをデタッチして、アプリケーションの実行を再開しても、アプリケーションは、実行を再開しない。なぜならば、non-invasiveモードのntsdデバッガが、まだアタッチされていて、プロセスをサスペンドさせているからだ。そこで、新しいデバッガをプロセスにアタッチすれば、デバッグが再開できる。

いうなれば、non-invasiveモードのntsdデバッガは、橋渡しの役割を果たす。つまり、デバッガを交換する間、プロセスを止めておけるのだ。

この情報は、誰かの役に立つはず。

ちなみに、Catch-22とは、同名の小説に由来するパラドックスである。小説内に出てくる、ジョン ヨサリアンという人物は、パイロットの軍務から免除されることを願っていた。「免除」されるには、軍医の診察を受けて、「飛行に不適」と診断されなければならない。

「不適」と診断されるには、パイロットが自ら志願して飛びたいと願えばよい。なぜならば、自ら身を危険に晒したいと考えるのは、「狂人」だからである。

しかし、「問題」は、「不適」と診断されるためには、まず自分から、「軍医の診察を受けたい」と申請しなければならない。自分から診察を願うぐらいなら、まだ「まとも」な精神状態である。この条件を考えると、「不適」と診断されるのは、不可能である。

No comments: