私は他のプロセスのスレッドを観察するために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
でタスクを続行します。- まず、私はプロセスにアタッチ:
呼び出すことにより、すべてのスレッドからの信号を得ました問題の核心:新しいスレッドが作成されたとき、私は観測プロセスでシグモップを受け取っていない。ただし、ptraceのドキュメントでは、「自動的に新しくクローンされたプロセスのトレースを開始します。これはSIGSTOPで始まります。」これはどうしたらできますか? – mupro
私は、procfsとposixスレッドを使った小さなアプリケーションを使って、さらに詳しい調査をしました。すべてのアプリケーションは、新しいスレッドを開始し、しばらくの間スリープすることです。新しいスレッドも数秒間スリープしています。私が言ったように、私は新しいスレッドのためのwaitpidを持つsigstopを受け取らないでしょう。しかし、新しいスレッド用のprocfsのステータスファイルには、私に言っている: 名前:thread_test 状態:T(トレース停止) TGID:2538 はPid:2545 PPID:2395 TracerPid:2540 ので、新しいスレッドがあるしwaitpidは停止信号を受信しません。スレッドをトレースする正しい方法は何ですか? – mupro