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:

Post a Comment

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.