다른 프로세스의 스레드를 관찰하기 위해 ptrace를 통합 한 Linux 응용 프로그램에서 작업하고 있습니다. 내가 관찰 한 애플리케이션이 자식 프로세스를 포크 (fork) 할 때 이미 잘 작동한다. 모든 아이들의 I 설치를 추적하기 위해ptrace 및 스레드
SIGSTOP
형태로 자식 프로세스SIGTRAP
부모
에서 내 응용 프로그램에서 waitpid를 호출하여 내가 관찰 응용 프로그램에서 다음과 같은 신호를 얻을 수 있습니다 PTRACE_O_TRACEFORK
, PTRACE_O_TRACEVFORK
, PTRACE_O_TRACECLONE
및 PTRACE_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
작업을 계속합니다.
호출하여 모든 스레드에서 신호를 얻었다 문제의 핵심 : 새 스레드가 생성 될 때 나는 관찰 과정에서 sigstop을받지 못합니다. 그러나, ptrace 문서에서 "자동으로 새로 복제 된 프로세스를 추적하기 시작합니다. SIGSTOP으로 시작합니다." 어떻게 될 수 있습니까? – mupro
나는 posix 스레드를 사용하는 procfs와 작은 응용 프로그램을 사용하여 조금 더 조사했다. 모든 응용 프로그램은 새 스레드를 시작하고 잠시 잠든 것입니다. 새 스레드도 몇 초 동안 자고 있습니다. 내가 말했듯이, 새로운 스레드를위한 waitpid를 가진 sigstop을받지 못했습니다. 새로운 스레드에 대한 함수는 procfs의 상태 파일은 나에게 말하고 그러나 : 이 이름 : thread_test가 주 : t이 (추적 정지) Tgid : 2538 도 (Pid) : 2545 PPID가 : 2,395 TracerPid : 2540 그래서 새로운 스레드가 중지했지만 waitpid가 중지 신호를 수신하지 않습니다. 쓰레드를 추적하는 올바른 방법은 무엇입니까? – mupro