2011-09-02 8 views
13

다른 프로세스의 스레드를 관찰하기 위해 ptrace를 통합 한 Linux 응용 프로그램에서 작업하고 있습니다. 내가 관찰 한 애플리케이션이 자식 프로세스를 포크 (fork) 할 때 이미 잘 작동한다. 모든 아이들의 I 설치를 추적하기 위해ptrace 및 스레드

  • SIGSTOP 형태로 자식 프로세스
  • SIGTRAP 부모

에서 내 응용 프로그램에서 waitpid를 호출하여 내가 관찰 응용 프로그램에서 다음과 같은 신호를 얻을 수 있습니다 PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK, PTRACE_O_TRACECLONEPTRACE_O_TRACEEXIT 인 ptrace.

모든 작업이 하위 프로세스와 잘 작동하지만 응용 프로그램의 스레드를 관찰 할 수는 없습니다. 스레드를 만드는 과정에서 SIGTRAP이 발생하지만 스레드로부터 어떤 신호도 얻지 못합니다.

스레드 및 ptrace에 특별한 것이 있습니까? strace은 스레드를 어떻게 추적합니까 (strace 코드의 스레드 전용의 특별한 루틴을 찾을 수 없었습니다)? 그런 다음 ptrace(PTRACE_ATTACH, pid, NULL, NULL);

  • 을 내가 waitpid() 전화 : 내가 프로세스에 연결

    • 첫째 : trace_pid = waitpid(-1, &status, 0);
    • 설정 ptrace 옵션 : ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);

    이것은 내 응용 프로그램에서 ptrace을 사용하는 방법입니다

    pid에 연결 한 후 waitpid()을 호출하고로 전화합니다. ptrace에 의해보고 된 모든 새로운 작업에 대해. 물론 이벤트 처리 후 SIGCONT 작업을 계속합니다.

  • +1

    호출하여 모든 스레드에서 신호를 얻었다 문제의 핵심 : 새 스레드가 생성 될 때 나는 관찰 과정에서 sigstop을받지 못합니다. 그러나, ptrace 문서에서 "자동으로 새로 복제 된 프로세스를 추적하기 시작합니다. SIGSTOP으로 시작합니다." 어떻게 될 수 있습니까? – mupro

    +0

    나는 posix 스레드를 사용하는 procfs와 작은 응용 프로그램을 사용하여 조금 더 조사했다. 모든 응용 프로그램은 새 스레드를 시작하고 잠시 잠든 것입니다. 새 스레드도 몇 초 동안 자고 있습니다. 내가 말했듯이, 새로운 스레드를위한 waitpid를 가진 sigstop을받지 못했습니다. 새로운 스레드에 대한 함수는 procfs의 상태 파일은 나에게 말하고 그러나 : 이 이름 : thread_test가 주 : t이 (추적 정지) Tgid : 2538 도 (Pid) : 2545 PPID가 : 2,395 TracerPid : 2540 그래서 새로운 스레드가 중지했지만 waitpid가 중지 신호를 수신하지 않습니다. 쓰레드를 추적하는 올바른 방법은 무엇입니까? – mupro

    답변

    13

    마지막으로, 나는 나 자신의 해결책을 발견했습니다 : 나는 내가에게 조금 더 가까이 왔어요 생각

    waitpid(-1, &status, __WALL) 
    

    대신

    waitpid(-1, &status, 0)