(다른 것들 중에서도) 시스템 호출을 모니터링하는 프로그램을 작성하고 있습니다. 하지만 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을 찾아 내 문제를 제안 할 것으로 보인다 전례가 없습니다.
나는 내 대답을 업데이트했습니다. 그렇습니다. 나는 ESRCH가 내가 받고있는 오류라고 믿습니다. – tay10r
왜이 라인을 가지고 있습니까? -if (! WIFSTOPPED (상태)) 계속 하시겠습니까? 부모는 자녀로부터 신호를받을 때까지 차단되어야합니다. –
나는 프로세스가 ptrace를 호출하기 전에 멈추게 될 것이라고 생각했다. 어쨌든, 나는 문제를 발견했다 (나는 나의 질문을 업데이트했다). – tay10r