Извините, что я не могу опубликовать код, чтобы воспроизвести это. Моя проблема в том, что я не знаю, как отладить эту проблему.
Я использую ptrace с PTRACE_O_TRACEFORK | PTRACE_O_TRACEEXEC | PTRACE_O_TRACEVFORK | PTRACE_O_TRACEVFORKDONE | PTRACE_O_TRACECLONE
для отслеживания процесса и его детей (и дочерних детей). Механизм очень похож на strace
, но имеет несколько иные цели, поскольку я просто отслеживаю файлы, которые читаются или изменяются.
Мой код (написанный на C) отлично работает на Debian wheezy и Debian jessie на архитектуре x86-64 (а также менее проверен на i386). Когда я пытаюсь скомпилировать и запустить на виртуальной машине Ubuntu Precise x86-64 (которая использует ядро 3.2.0), я столкнулся с трудностями.
На машине Precise я иногда обнаруживаю, что я не получаю PTRACE_EVENT_VFORK
сразу после вызова vfork
, но вместо этого начинаю принимать события (пару событий SIGSTOP
и несколько системных вызовов) без когда-либо получая событие PTRACE_EVENT_VFORK
. Я не вижу ничего подозрительного в выполняемых системных вызовах, и поведение не предсказуемо.
Я не уверен, что попытаться уменьшить это до минимального случая ошибки, и я действительно не имею ни малейшего представления о том, что может пойти не так, никогда прежде не наблюдал такого поведения отсутствующих событий. Вполне возможно, что различие не является ядром, а скорее инструментами построения, которые я отслеживаю (что представляет собой комбинацию python + gcc).
Любые предложения?