2011-09-02 4 views
13

私は他のプロセスのスレッドを観察するためにptraceを組み込んだlinuxアプリケーションに取り組んでいます。私が観察するアプリケーションが子プロセスをフォークするとき、これはすでにかなりうまく機能しています。すべての子どもIセットアップを追跡するために、親 ptraceとスレッド

から子プロセス

  • SIGTRAPを形成

    • SIGSTOP:私のアプリケーションでのwaitpidを呼び出すことによって、私は観察したアプリケーションで、次の信号を得ることができますPTRACE_O_TRACEFORK,,PTRACE_O_TRACECLONE,PTRACE_O_TRACEEXITとptrace。

      子プロセスですべてが正常に動作していますが、アプリケーションのスレッドを監視することはできません。私はスレッドを作成するプロセスからSIGTRAPを取得しますが、スレッドからのシグナルは得られません。

      スレッドとptraceには特別なものはありますか?どのようにstraceスレッド(私はstraceのコードでスレッドに専用の特別なルーチンを見つけることができませんでした)を追跡するのですか?

      これは私が自分のアプリケーションでptraceを使用する方法である:

      • まず、私はプロセスにアタッチ:ptrace(PTRACE_ATTACH, pid, NULL, NULL);
      • その後、私はwaitpid()呼び出す:trace_pid = waitpid(-1, &status, 0);
      • 設定しptraceオプション:ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);

      pidに接続した後、私はwaitpid()を呼び出して呼び出し、によって報告される新しいタスクごとにもちろん、私はイベントの処理後にSIGCONTでタスクを続行します。

  • +1

    呼び出すことにより、すべてのスレッドからの信号を得ました問題の核心:新しいスレッドが作成されたとき、私は観測プロセスでシグモップを受け取っていない。ただし、ptraceのドキュメントでは、「自動的に新しくクローンされたプロセスのトレースを開始します。これはSIGSTOPで始まります。」これはどうしたらできますか? – mupro

    +0

    私は、procfsとposixスレッドを使った小さなアプリケーションを使って、さらに詳しい調査をしました。すべてのアプリケーションは、新しいスレッドを開始し、しばらくの間スリープすることです。新しいスレッドも数秒間スリープしています。私が言ったように、私は新しいスレッドのためのwaitpidを持つsigstopを受け取らないでしょう。しかし、新しいスレッド用のprocfsのステータスファイルには、私に言っている: 名前:thread_test 状態:T(トレース停止) TGID:2538 はPid:2545 PPID:2395 TracerPid:2540 ので、新しいスレッドがあるしwaitpidは停止信号を受信しません。スレッドをトレースする正しい方法は何ですか? – mupro

    答えて

    13

    最後に、私は自分自身が解決策を見つけた:私は私がに少し近づくしたと思う

    waitpid(-1, &status, __WALL) 
    

    代わりの

    waitpid(-1, &status, 0)