2011-09-02 6 views
13

Je travaille sur une application linux intégrant ptrace pour observer les threads d'un autre processus. Quand l'application que j'observe forks un processus d'enfant cela fonctionne déjà très bien. En appelant waitpid dans ma demande je peux obtenir les signaux suivants dans l'application d'observation:ptrace et threads

  • SIGSTOP forme le processus enfant
  • SIGTRAP du parent

Pour garder une trace de tous les enfants que je configuration ptrace avec PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK, PTRACE_O_TRACECLONE et PTRACE_O_TRACEEXIT.

Bien que tout fonctionne assez bien avec les processus enfants, je ne peux pas observer les threads de l'application. J'obtiens le SIGTRAP du processus créant le fil mais je n'obtiens aucun signal du fil.

Y a-t-il quelque chose de spécial avec les filetages et ptrace? Comment est-ce que strace garde trace des discussions (je n'ai pas trouvé de routines spéciales dédiées aux threads dans le code de strace)?

Voilà comment j'utilise ptrace dans ma demande:

  • D'abord, je joins à un processus: ptrace(PTRACE_ATTACH, pid, NULL, NULL);
  • Puis, je l'appelle waitpid(): trace_pid = waitpid(-1, &status, 0);
  • Set ptrace Options: ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);

Après avoir joint à pid, j'appelle le waitpid() en boucle et j'appelle le ptrace(PTRACE_SETOPTIONS... pour chaque nouvelle tâche signalée par ptrace. Bien sûr, je continue les tâches avec SIGCONT après la gestion des événements.

+1

Je pense que je suis venu un peu plus près de la noyau du problème: Quand un nouveau thread est créé, je ne reçois même pas le sigstop dans le processus d'observation. Cependant, dans la documentatio ptrace il sais: "commencer automatiquement à tracer le processus nouvellement cloné, qui commencera par un SIGSTOP." Comment cela peut-il arriver? – mupro

+0

J'ai fait un peu plus d'investigations en utilisant procfs et une petite application utilisant des threads posix. Tout ce que l'application fait est de démarrer un nouveau thread et de dormir pendant un moment. Le nouveau thread est également en train de dormir pendant quelques secondes. Comme je l'ai dit, je n'ai pas reçu de sigstop avec waitpid pour le nouveau thread. Cependant, le fichier d'état dans procfs pour le nouveau fil me dit: Nom: thread_test État: t (arrêt traçage) TGID: 2538 Pid: 2545 ppid: 2395 TracerPid: 2540 Ainsi, le nouveau fil est arrêté mais waitpid ne reçoit pas le signal d'arrêt. Quelle est la bonne façon de tracer les fils? – mupro

Répondre

13

Enfin, je me suis trouvé la solution: je suis les signaux de tous les fils en appelant

waitpid(-1, &status, __WALL) 

au lieu de

waitpid(-1, &status, 0)