Я пишу программу, которая контролирует системные вызовы (между прочим). Но у меня возникли проблемы с получением ptrace для распознавания идентификатора процесса, который я передаю ему. При выполнении программы, я получаю сообщение об ошибке:PTrace Not Recognising Child Process
:No such process
Однако, я проверил идентификатор процесса перед вызовом, печатая его на консоль и проверки его с ps -all
.
Вот некоторые из кода, который может иметь отношение (я могу разместить больше, если необходимо):
Заголовок дочернего процесса:
/* Call to be traced */
if (ptrace (PTRACE_TRACEME, 0, 0, 0) < 0){
perror ("Process couldn't be traced");
exit (-1);
}
/* Execute process image */
if (execv (ProcessArgs[0], &ProcessArgs[1]) < 0){
perror ("Couldn't execute process");
exit (-1);
}
В потоке родительского процесса:
DbgdProcess * _Process = (DbgdProcess *) _ProcessPass;
int SystemCall = 0,
Status = 0;
/* I have tried sleep(1) here to wait for PTRACE_ME to no avail */
while (!_Process->CloseSignal){
if (wait (&Status) < 0) // error handler
if (WIFEXITED (Status)) // error handler
if (!WIFSTOPPED (Status)) continue;
SystemCall = ptrace (PTRACE_PEEKUSER, _Process->ID, 4 * ORIG_RAX, 0);
if (SystemCall < 0) // error handler
printf ("Process made system call %d\n", SystemCall);
if (ptrace (PTRACE_CONT, _Process->ID, 0, 0) < 0) // error handler
}
Может кто-нибудь объяснить это поведение мне?
Некоторые дополнительные примечания:
- Процесс отлаживается является прямым потомком родителя
- Я уверен, что это 64 бит компиляции, потому что SYS/reg.h только определяет RAX
- Все обработчики ошибок содержать сообщение
Update PError():
Я прочитал это со страницы человека:
Большинство команд ptrace (все, кроме PTRACE_ATTACH, PTRACE_SEIZE, PTRACE_TRACEME, PTRACE_INTERRUPT и PTRACE_KILL) требуют Tracee быть в ptrace-стоп, в противном случае они сбой ESRCH.
ESRCH, я считаю, дает сообщение «Нет такого процесса». Может быть, процесс не прерывается, когда я делаю вызов ptrace?
Update:
Я проверял код в этом example. Я получаю его на работу после того, как делать следующее: - обновление заголовка от до - изменение (eax_orig * 4) к (rax_orig * 8)
Но эти изменения, а также, в моей программе, и это все еще не работает.
Update:
У меня есть мой код работает. Я не совсем уверен, почему, но он начал работать после того, как я вызвал PTRACE_ATTACH в том же потоке, который вызывает вызовы опроса с помощью ptrace (2). Я предполагаю, что это означало бы, что ptrace должен использоваться в одном потоке родительского процесса, но я не совсем уверен. Теперь мой вопрос: кто-нибудь знает, правда ли это? Или, если нет, почему ptrace ведет себя так?
Update:
Я нашел этот link, который наводит на мысль, моя проблема не слыхивали.
Я обновил свой ответ, да, я верю, что ESRCH - это ошибка, которую я получаю – tay10r
Почему у вас есть эта строка -if (! WIFSTOPPED (Status)) continue; ??? Родитель должен быть заблокирован до получения сигнала от ребенка. –
Я думал, что он будет гарантировать, что процесс будет остановлен до вызова ptrace. В любом случае, я думаю, что нашел проблему (я обновил свой вопрос). – tay10r