8

私は主にLinuxをターゲットとするGUI指向のデバッガーを書いていますが、将来的には他のOSへの移植を計画しています。GUIは常にインタラクティブである必要があるため、さまざまな処理を行うスレッドがいくつかあります。

主に、waitpidが戻るのを待ってループし、受信したイベントを他のスレッドに配信する「デバッグイベント」スレッドがあります。これを行うのは、waitpidにタイムアウトがないため、他のイベントループと統合して応答性を維持することが非常に困難になるためです(waitpidは無期限にハングする可能性があります)。

この戦略は、これまでのLinuxビルドでうまく機能しました。最近、デバッガースレッドを認識させようとしています(デバッガー自体ではなく、デバッグされたアプリケーションのスレッドのように)。

そこで、クローンイベントを追跡するようにptraceオプションを設定し、上位16ビットがに設定されているステータスを探しますPTRACE_EVENT_CLONE。次にPTRACE_GETEVENTMSG、新しいスレッドのTIDを取得するために使用します。これはすべて、私の小さなテストハーネスアプリケーションでうまく機能します。しかし、何らかの理由で、そのコードを実際のデバッガーに配置すると失敗します。(「そのようなプロセスはありません」というエラーコードが表示されます)

私が思いついたのは、Windowsには、アプリケーションに接続されたスレッドだけがデバッグイベントをリッスンできるというルールがあるということです。Linuxのptraceにも同様の制限がありますか?もしそうなら、なぜ私のコードは他のデバッグイベントで機能するのですか?

編集:

少なくともwaitpidは別のスレッドからの待機をサポートしているようです。manページには次のように書かれています。

Linux 2.4より前は、スレッドはプロセスの特殊なケースでした。その結果、別のスレッドが同じスレッドグループに属している場合でも、あるスレッドは別のスレッドの子を待つことができませんでした。ただし、POSIXはそのような機能を規定しており、Linux 2.4以降、スレッドは同じスレッドグループ内の他のスレッドの子を待機できます。デフォルトでは待機します。

したがって、これはせいぜいptraceの制限です。

4

2 に答える 2

5

Maxine VMデバッガーのLinux固有の部分を実装しているときに、同じ問題(および他の多くの問題)が発生しました。デバッガー内の1つのスレッドのみがptraceを使用してデバッグ対象を制御できるという推測は正しいです。これは、専用スレッドでptraceをすべて呼び出すことで実現します。kenai.com/projects/maxine/sources/maxine/showにあるMaxineソースのLinuxTask.java、linuxTask.h、およびlinuxTask.cファイルを確認すると便利な場合があります。

于 2009-12-08T17:48:20.240 に答える
4

私の知る限り、これは許可されていません。ptraceタスクは、アタッチされていないタスクでは使用できません。また、タスクは最大で1つの他のタスクによってトレースできるため、各スレッドに1回だけアタッチすることはできません。これは、あるタスクが別のタスクにアタッチされると、トレースタスクがトレースされたタスクの親になり、各タスクが持つことができる親は1つだけになるためだと思います。

スレッドは同じプロセスの一部であるため、マルチスレッドトレースを許可する必要があるようですが、実装に関しては、Linuxカーネルのスレッドとプロセスの間に実際にはあまり違いはありません。スレッドは、そのリソースのほとんどを別のタスクと共有するために発生する単なるタスクです。

興味がある場合は、カーネル内のptraceのソースコードを参照できます。具体的には、ほとんどのリクエストptrace_check_attachで呼び出されるを見てください。ターゲットタスクの親が現在のタスクでない場合は、(取得しているエラーコードのように聞こえます)sys_ptrace戻ります。-ESRCH

于 2009-07-11T02:42:51.847 に答える