2014-01-15 2 views
1

Я ptracing многопоточное приложение и 9 из 10 раз, breakpointhandling работает отлично, но иногда я получаю событие SIGCHLD вместо SIGTRAP.ptrace (PTRACE_SINGLESTEP) + waitpid = SIGCHLD

Это последовательность:

  • приложение работает, основной поток попадает INT3
  • waitpid отладчика возвращает SIGTRAP
  • отладчик SIGSTOPs все потоки, которые уже не "т (трассировка остановка)", используя tgkill
  • отладчик работает ptrace (PTRACE_SINGLESTEP) на INT3'ed нити (после фиксации RIP и 0xCC байт)
  • отладчика waitpid годов и ожидает SIGTRAP, но получает SIGCHLD вместо

Что я должен делать с этим SIGCHILD? Игнорирование этого делает отладчик застрял навсегда в следующих waitpids. Внедряя его обратно в дебюта с винтами PTRACE_CONT с исходным PTRACE_SINGLESTEP.

Похоже, что это происходит только для основных потоков (PID == TID), а не для childthreads (aka LWP).

Я использую UBUNTU 12.04 64bit в виртуальной коробке.

ответ

1

Внедрение SIGCHLD с PTRACE_SINGLESTEP (data param) обратно в дебюге, похоже, трюк.

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