web-dev-qa-db-fra.com

Stracing pour attacher à un processus multi-thread

Si je veux structurer un processus multi-thread (de tous ses threads), comment dois-je le faire?

Je sais que l'on peut faire strace -f pour suivre un processus fourchu? Mais que diriez-vous de vous attacher à un processus qui est déjà multi-thread lorsque je commence à étirer? Est-ce un moyen de dire à strace de tracer tous les appels système de tous les threads qui appartiennent à ce processus?

30
yangsuli

Je viens de le faire de manière maladroite, en répertoriant chaque tid à tracer.

Vous pouvez les trouver via ps:

$ ps auxw -T | fgrep program_to_trace
me pid tid1 ...
me pid tid2 ...
me pid tid3 ...
me pid tid4 ...

puis, selon man strace, vous pouvez joindre plusieurs pids à la fois:

   -p pid      Attach to the process with the process ID pid and begin tracing.  The trace may be terminated at any time by a  keyboard  interrupt
               signal  (CTRL-C).  strace will respond by detaching itself from the traced process(es) leaving it (them) to continue running.  Mul‐
               tiple -p options can be used to attach to up to 32 processes in addition to command (which is optional if at least one -p option is
               given).

Il dit pid, mais iirc sur Linux, le pid et le tid partagent le même espace de noms, et cela semble fonctionner:

$ strace -f -p tid1 -p tid2 -p tid3 -p tid4

Je pense que c'est peut-être le mieux que vous puissiez faire pour l'instant. Mais je suppose que quelqu'un pourrait étendre strace avec un drapeau pour étendre les tids. Il y aurait probablement encore une course entre trouver les processus et s'y attacher au cours de laquelle un processus fraîchement commencé serait manqué. Cela cadrerait avec la mise en garde existante concernant strace -f:

   -f          Trace child processes as they are created by currently traced processes as a result of the fork(2) system call.

               On non-Linux platforms the new process is attached to as soon as its pid is known (through the return value of fork(2) in the  par‐
               ent process). This means that such children may run uncontrolled for a while (especially in the case of a vfork(2)), until the par‐
               ent is scheduled again to complete its (v)fork(2) call.  On Linux the child is traced from its first instruction with no delay.  If
               the  parent  process  decides  to  wait(2)  for  a child that is currently being traced, it is suspended until an appropriate child
               process either terminates or incurs a signal that would cause it to terminate (as determined from the child's current signal dispo‐
               sition).

               On SunOS 4.x the tracing of vforks is accomplished with some dynamic linking trickery.
24
Scott Lamb

Comme répondu dans plusieurs commentaires, strace -fp <pid> affichera la trace de tous les threads appartenant à ce processus - même ceux qui ont déjà été générés avant que strace ne commence.

15
Blake H