という名前の「デバッガー」のようなアプリケーションがありますhyper-ptrace
。user_appl3
NPTLでマルチスレッド化されたものから始まります。
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
両方のスレッドを分析する必要があります。一部の部分は、スレッドが停止している場合にのみ実行できます。
前もって感謝します!