2013-05-27 10 views
1

Я пишу программу, которая контролирует системные вызовы (между прочим). Но у меня возникли проблемы с получением 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, который наводит на мысль, моя проблема не слыхивали.

ответ

0

sleep (1) иногда недостаточно; попробуйте спать (5).

0

Почему вы делаете PTRACE_SYSCALL, прежде чем проверять, остановлен ли процесс или нет?

В идеальном случае в родительском потоке вы должны подождать, пока ребенок остановится, используя wait.

Как только ребенок останавливается с WIFSTOPPED, используйте только любые другие вызовы ptrace.

похоже, что ESRCH возвращается PTRACE_SYSCALL. Не могли бы вы подтвердить это?

+0

Я обновил свой ответ, да, я верю, что ESRCH - это ошибка, которую я получаю – tay10r

+0

Почему у вас есть эта строка -if (! WIFSTOPPED (Status)) continue; ??? Родитель должен быть заблокирован до получения сигнала от ребенка. –

+0

Я думал, что он будет гарантировать, что процесс будет остановлен до вызова ptrace. В любом случае, я думаю, что нашел проблему (я обновил свой вопрос). – tay10r