Pracuję nad aplikacją linux zawierającą ptrace do obserwacji wątków innego procesu. Kiedy aplikacja obserwuję widelce proces potomny, to już działa całkiem dobrze. Wywołując waitpid w mojej aplikacji można uzyskać następujące sygnały we wniosku obserwacji:ptrace i wątki
SIGSTOP
forma procesu potomnegoSIGTRAP
od rodzica
Aby śledzić wszystkie dzieci Instalatora ptrace z PTRACE_O_TRACEFORK
, PTRACE_O_TRACEVFORK
, PTRACE_O_TRACECLONE
i PTRACE_O_TRACEEXIT
.
Podczas gdy wszystko działa dobrze z procesami potomnymi, nie mogę obserwować wątków aplikacji. Otrzymuję SIGTRAP
z procesu tworzenia wątku, ale nie otrzymuję żadnych sygnałów z wątku.
Czy jest coś specjalnego z wątkami i ptrace
? W jaki sposób strace
śledzić wątki (nie mogłem znaleźć żadnych specjalnych procedur poświęconych wątkom w kodzie strace
)?
ten sposób używam ptrace
w mojej aplikacji:
- pierwszy dołączyć do procesu:
ptrace(PTRACE_ATTACH, pid, NULL, NULL);
- Potem zadzwoń
waitpid()
:trace_pid = waitpid(-1, &status, 0);
- Ustaw
ptrace
opcje:ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);
Po dołączeniu do pid dzwonię pod numer waitpid()
i dzwonię pod numer ptrace(PTRACE_SETOPTIONS...
dla każdego nowego zadania zgłoszonego przez ptrace
. Oczywiście kontynuuję zadania po SIGCONT
po obsłudze zdarzeń.
Chyba przyjść nieco bliżej rdzeń problemu: Kiedy tworzony jest nowy wątek, nie otrzymuję nawet sigstopa w procesie obserwacji. Jednak w dokumentacji ptrace jest to: "automatycznie rozpocząć śledzenie nowo sklonowanego procesu, który rozpocznie się od SIGSTOP." Jak to się może stać? – mupro
Zrobiłem trochę dalszych badań przy użyciu procfs i małej aplikacji używającej wątków POSIX. Cała aplikacja robi to, aby rozpocząć nowy wątek i spać przez chwilę. Nowy wątek również śpi przez kilka sekund. Jak już wspomniałem, nie otrzymałem sigstop z waitpidem dla nowego wątku. Jednak plik status w PROCFS dla nowego wątku mówi mi: Nazwa: thread_test Stan: t (śledzenie stop) Tgid: 2538 Pid: 2545 ppid: 2395 TracerPid: 2540 Tak więc nowy wątek jest zatrzymany, ale waitpid nie odbiera sygnału zatrzymania. Jaki jest prawidłowy sposób śledzenia wątków? – mupro