2016-10-27 10 views
0

Я интегрировал Google-Breakpad в моем приложении на C++. Теперь я намеренно сбой приложения, но он зависает в моей системе Ubuntu i686. Я должен положить printf всюду в Breakpad, чтобы проверить, где именно он висит. Итак, в breakpad создается дочерний процесс клона и в этом процессе ptrace(PTRACE_ATTACH, pid, NULL, NULL), за которым следует waitpid(pid, NULL, __WALL) Syscall вызывается в каждом потоке. С одним конкретным потоком waitpid входит в бесконечное состояние ожидания, и я тогда должен умышленно убить приложение.waitpid в состоянии ожидания infutine после PTRACE_ATTACH

Кто-нибудь знает, почему именно это происходит? Почему с этим одним конкретным потоком waitpid() идет в состоянии ожидания infinte? Есть ли решение для того же?

Спасибо.

+0

Вы должны предоставить дополнительную информацию. Непонятно, о чем вы спрашиваете. Я думаю, что форумы поддержки брейк-площадок - лучшее место, чтобы задать этот вопрос. –

+0

Я голосую, чтобы закрыть этот вопрос как не относящийся к теме, потому что он слишком широк для переполнения стека и действительно принадлежит к форумам поддержки break-pad. –

+0

@ShacharShemesh Я уже задал вопрос на форуме breakpad (https://groups.google.com/forum/#!topic/google-breakpad-discuss/2Ajlsnvkjpw). И я думаю, что я дал всю необходимую информацию. Просто рассматривайте это как обычную проблему без предметной области. Мне просто нужно знать, в чем причина того, что 'waitpid' переходит в бесконечное состояние ожидания после' ptrace (PTRACE_ATTACH ..) 'вызывает один конкретный поток? Не похоже, чтобы никто не использовал ptrace и waitpid комбинацию. – Arpit

ответ

0

Как правило, PTRACE_ATTACH не гарантирует, что процесс будет иметь что-либо сообщить. После PTRACE_ATTACH waitpid будет срабатывать только при возникновении одной из двух вещей:

  • Дебюгант получает сигнал.
  • Дебют существует.

Некоторые вещи равносильны одной из этих вещей. Например, если debugee вызывает execve, то после успешного выполнения ядро ​​отображает его , как если бы получил сообщение TRAP.

Если ни одна из этих ситуаций не возникает, нет причин для PTRACE_ATTACH делать что-либо вообще.

Если вы хотите вернуть waitpid (скажем, потому что вы хотите изменить состояние дебюта), просто отправьте сигнал в поток после вызова PTRACE_ATTACH. Это гарантирует, что в потоке есть что рассказать.

Смежные вопросы