3

という名前の「デバッガー」のようなアプリケーションがありますhyper-ptraceuser_appl3NPTLでマルチスレッド化されたものから始まります。

hyper-ptrace のメイン ループは次のとおりです。

wait3(&status, FLAGS, &u);
// find a pid of child, which has a signal
switch (signal = WSTOPSIG(status))
{
  case SIGTRAP:
    do_some_analysis_of_the_child(pid, &status) // up to several ms
    break;
}
ptrace(PTRACE_CONT, pid); // discard signal, user_appl3 doesn't know anything 
                          //about this SIGTRAP

SIGTRAP は、ハードウェアによってスレッドごとに一定の間隔で user_appl3 に対して生成され、一部のスレッドに配信されます。間隔は 100..1 ミリ秒以下にすることができます。これは、割り込みを伴う一種の CPU ごとのクロックです。各スレッドは、その CPU のみで実行されます (アフィニティーでバインドされます)。

だから質問があります1 :

スレッド 1が TRAP を取得し、デバッガーが に入りdo_some_analysis_of_the_child(デバッガーが 2 番目のスレッドを実行しないwait3)、しばらくしてスレッド 2 も TRAP を取得した場合、Linux カーネルはどうしますか?

私の意見では、シグナルを受信し、待機中のデバッガーがあるため、thread1 は停止します。しかし、thread2 は引き続き実行されます (そうですか? )。スレッド 2 がシグナルを受け取ると、待機中のデバッガーがないため、TRAP をスレッド 2 自体に配信して、効果的にスレッドを強制終了できます。私は正しいですか?

そして、2 番目の質問 question2 があります

この場合、デバッガーを介してユーザーのスレッドにシグナルを送信する可能性を下げるために、メイン ループどのように書き直せばよいでしょうか? トラップを生成するハードウェアも、ユーザー アプリケーションも変更できません。2 番目のスレッドを停止することも変種ではありません。hyper-ptrace

両方のスレッドを分析する必要があります。一部の部分は、スレッドが停止している場合にのみ実行できます。

前もって感謝します!

4

1 に答える 1

6

いいえ、シグナルはアプリケーションに配信されません。シグナルが発生すると、子アプリケーションは停止し、ptracing プロセスは、次に呼び出されたときに通知されますwait()

その通りです。トレース停止はメイン スレッドにのみ適用されます。

SIGSTOP必要な動作を得るには、トレース対象のスレッドがプロセス PID に を送信して停止した直後に子プロセス全体 (すべてのスレッド) を一時停止し、完了SIGCONTしたら a で再開します。

wait3(&status, FLAGS, &u);

if (WIFSTOPPED(status))
    kill(pid, SIGSTOP);  /* Signal entire child process to stop */

switch (signal = WSTOPSIG(status))
{
  case SIGTRAP:
    do_some_analysis_of_the_child(pid, &status) // up to several ms
    break;
}

ptrace(PTRACE_CONT, pid, 0, 0); // discard signal, user_appl3 doesn't know anything about this SIGTRAP
kill(pid, SIGCONT);  /* Signal entire child process to resume */
于 2010-08-20T01:41:26.453 に答える