Я 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 в виртуальной коробке.