2011-09-02 17 views
13

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 potomnego
  • SIGTRAP 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ń.

+1

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

+0

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

Odpowiedz

13

Wreszcie znalazłem rozwiązanie siebie: Mam sygnały z wszystkich wątków wywołując

waitpid(-1, &status, __WALL) 

zamiast

waitpid(-1, &status, 0)