1

C++ アプリケーションにGoogle-Breakpadを統合しました。現在、意図的にアプリケーションをクラッシュさせていますが、Ubuntu i686 システムでハングアップします。printfどこにぶら下がっているかを正確に確認するには、Breakpad のどこにでも配置する必要があります。そのため、ブレークパッドでは、クローンの子プロセスが作成され、そのプロセスでは、syscall にptrace(PTRACE_ATTACH, pid, NULL, NULL)続いてwaitpid(pid, NULL, __WALL)、すべてのスレッドで呼び出されます。ある特定のスレッドで、waitpid が無限待機状態になり、故意にアプリケーションを強制終了する必要があります。

なぜこれが正確に起こっているのか誰にも分かりますか?この特定のスレッドwaitpid()が無限待機状態になるのはなぜですか? 同じ解決策はありますか?

ありがとう。

4

1 に答える 1

0

一般に、PTRACE_ATTACH は、プロセスが報告するものがあることを保証しません。PTRACE_ATTACH の後、次の 2 つのいずれかが発生した場合にのみ、waitpid がトリガーされます。

  • デバッグ対象がシグナルを受信します。
  • デバッグ対象が存在します。

いくつかのものは、それらのものの1つと同等です。たとえば、デバッグ対象が を呼び出した場合、execve実行が成功した後、カーネルはデバッグ対象がシグナルを受信したかのように表示しTRAPます。

これらの状況がまったく発生しない場合は、PTRACE_ATTACH何もする必要はありません。

waitpid戻りたい場合(たとえば、デバッグ対象の状態を変更したい場合)、 を呼び出した後にスレッドにシグナルを送信するだけPTRACE_ATTACHです。これにより、スレッドがあなたに伝えたいことがあることが保証されます。

于 2016-10-29T06:56:19.930 に答える