2011-09-02 8 views
13

Estoy trabajando en una aplicación de Linux que incorpora ptrace para observar los hilos de otro proceso. Cuando la aplicación que observo incluye un proceso secundario, esto ya funciona bastante bien. Llamando waitpid en mi aplicación puedo obtener las siguientes señales en la aplicación de la observación:ptrace and threads

  • SIGSTOP forma que el proceso hijo
  • SIGTRAP del padre

Para mantener un registro de todos los niños I fijó ptrace con PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK, PTRACE_O_TRACECLONE y PTRACE_O_TRACEEXIT.

Si bien todo funciona bastante bien con procesos secundarios, no puedo observar los hilos de la aplicación. Obtengo el SIGTRAP del proceso que crea el hilo, pero no recibo ninguna señal del hilo.

¿Hay algo especial con hilos y ptrace? ¿Cómo realiza strace un seguimiento de los hilos (no pude encontrar ninguna rutina especial dedicada a los hilos en el código de strace)?

Esta es la forma en que uso ptrace en mi solicitud:

  • En primer lugar hay que adjuntar a un proceso: ptrace(PTRACE_ATTACH, pid, NULL, NULL);
  • Entonces, llamo waitpid(): trace_pid = waitpid(-1, &status, 0);
  • Conjunto ptrace opciones: ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEEXIT);

Después de adjuntar a pid estoy llamando al waitpid() en un bucle y llamo al ptrace(PTRACE_SETOPTIONS... para cada tarea nueva informada por ptrace. Por supuesto, continúo las tareas con SIGCONT después del manejo del evento.

+1

Creo que he llegado un poco más cerca de la núcleo del problema: cuando se crea un nuevo hilo, ni siquiera recibo el sigstop en el proceso de observación. Sin embargo, en la documentación documental se dice: "comenzar a rastrear automáticamente el proceso recién clonado, que comenzará con un SIGSTOP". ¿Cómo puede pasar esto? – mupro

+0

He investigado un poco más el uso de procfs y una pequeña aplicación usando posix threads. Todo lo que hace la aplicación es comenzar un nuevo hilo y dormir por un tiempo. El nuevo hilo también está durmiendo por unos segundos. Como dije, no recibiría una sigstop con waitpid para el nuevo hilo. Sin embargo, el archivo de estado en procfs para el nuevo hilo me está diciendo: Nombre: thread_test Estado: t (parada de calco) TGID: 2538 Pid: 2545 ppid: 2395 TracerPid: 2540 Así que el nuevo hilo es detenido pero waitpid no recibe la señal de parada. ¿Cuál es la forma correcta de rastrear hilos? – mupro

Respuesta

13

Por último, he encontrado la solución a mí mismo: Tengo las señales de todos los hilos llamando

waitpid(-1, &status, __WALL) 

en lugar de

waitpid(-1, &status, 0)