2013-05-27 3 views
1

(다른 것들 중에서도) 시스템 호출을 모니터링하는 프로그램을 작성하고 있습니다. 하지만 ptrace가 전달하는 프로세스 ID를 인식하는 데 문제가 있습니다. 그러나, 나는 바로 콘솔로 인쇄하고 ps -all로를 확인하여 호출하기 전에 프로세스 ID를 확인했습니다PTrace가 자식 프로세스를 인식하지 못합니다.

:No such process 

: 프로그램을 실행하면,이 오류 메시지가 표시됩니다.

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 
} 
: 부모 프로세스의 스레드에서

/* 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); 
} 

: 자식 프로세스 제목

:

여기에 관련 될 수있는 코드의 일부는 (내가 필요한 경우 더 게시 할 수 있습니다)입니다

누구든지 나에게이 행동을 설명해 주시겠습니까?

일부 추가 참고 :

  • 디버깅중인 프로세스는 부모의 직접적인 자식
  • 나는 SYS/reg.h 만 RAX
  • 정의하기 때문에 이것은 64 비트 컴파일입니다 확신 해요

    :
  • 모든 오류 처리기는 perror는() 메시지

업데이트를 포함 그들은

대부분의 ptrace 명령 (모든 PTRACE_ATTACH, PTRACE_SEIZE, PTRACE_TRACEME, PTRACE_INTERRUPT 및 PTRACE_KILL 제외)의 ptrace 스톱에있을 tracee 을 요구, 그렇지

나는 그 사람 페이지에서이 작업을 읽었습니다 ESRCH로 실패합니다.

ESRCH는 'No such process'라는 메시지를 제공합니다. 그래서 프로세스가 ptrace 호출을 만들 때 ptrace 중지되지 않았습니까?

업데이트 :

내가이 example의 코드를 테스트했다. 나는 다음을 수행 한 후 작동하도록 점점 않았다있다 - 까지 헤더를 업데이트 - 로 변경 (* 4 eax_orig)을 (rax_orig * 8)

하지만 그 변경하고,뿐만 아니라, 내 프로그램과 그것을이다 그래도 작동이 안되는.

업데이트 :

나는 내 코드가 작동있어. 왜 그런지 모르겠지만 ptrace (2)를 사용하여 폴링 호출을하는 동일한 스레드 내에서 PTRACE_ATTACH를 호출 한 후에 작업을 시작했습니다. 나는 그것이 ptrace가 부모 프로세스의 같은 쓰레드 내에서 사용되어야한다는 것을 의미 할 것이라고 생각하지만 나는 완전히 확신하지 못한다. 내 질문은 지금 그것이 사실인지 누구든지 알 수 있습니까? 그렇지 않다면, 왜 ptrace가 이런 식으로 행동 하는가?

업데이트 :

내가이 link을 찾아 내 문제를 제안 할 것으로 보인다 전례가 없습니다.

답변

0

수면 (1)이 때때로 충분하지 않습니다. (5) 수면을 시도하십시오.

0

왜 프로세스가 중지되었는지 확인하기 전에 PTRACE_SYSCALL을 (를)하고 있습니까?

이상적으로, 부모 스레드에서 wait를 사용하여 자식이 중지 할 때까지 기다려야합니다.

자식이 WIFSTOPPED로 중지되면 다른 ptrace 호출 만 사용하십시오.

ESRCH가 PTRACE_SYSCALL에 의해 반환되는 것처럼 보입니다. 당신은 그것을 확인해 주시겠습니까

+0

나는 내 대답을 업데이트했습니다. 그렇습니다. 나는 ESRCH가 내가 받고있는 오류라고 믿습니다. – tay10r

+0

왜이 라인을 가지고 있습니까? -if (! WIFSTOPPED (상태)) 계속 하시겠습니까? 부모는 자녀로부터 신호를받을 때까지 차단되어야합니다. –

+0

나는 프로세스가 ptrace를 호출하기 전에 멈추게 될 것이라고 생각했다. 어쨌든, 나는 문제를 발견했다 (나는 나의 질문을 업데이트했다). – tay10r

관련 문제