tagger tag picard musicbrainz linux multithreading backtrace

linux - picard - tag mp3 ubuntu



Obtención de un backtrace de otro hilo. (3)

En Linux, para obtener un backtrace puede usar la llamada a la biblioteca backtrace (), pero solo devuelve el backtrace del hilo actual. ¿Hay alguna manera de obtener un seguimiento de algún otro hilo, suponiendo que sé que es TID (o pthread_t) y puedo garantizar que duerme?

Parece que el proyecto libunwind (http://www.nongnu.org/libunwind/) puede ayudar. El problema es que CentOS no lo admite, por lo que prefiero no usarlo.

¿Alguna otra idea? Gracias.


El manejo de la señal con la ayuda de retroceso puede resolver su propósito.

Quiero decir que si tiene un PID del hilo, puede emitir una señal para ese hilo. y en el manejador puedes usar el backtrace. ya que el controlador se ejecutaría en ese subproceso partucular, el retroceso sería el resultado que se necesita.


Yo mismo lo implementé here .

Inicialmente, quería implementar algo similar a lo que se sugiere here , es decir, obtener el puntero de marco superior del subproceso y desenrollarlo manualmente (la fuente vinculada se deriva de la implementación de backtrace Apple, por lo tanto podría ser específica de Apple, pero la idea es genérica) .

Sin embargo, para tener esa seguridad (y la fuente anterior no es, e incluso puede estar rota), debe suspender el hilo mientras accede a su pila. Busqué diferentes formas de suspender un hilo y encontré this , this y this . Básicamente, no hay una manera realmente buena. El truco común, también utilizado por la máquina virtual Hotspot JAVA , es utilizar señales y enviar una señal personalizada a su hilo a través de pthread_kill .

Por lo tanto, como de todas formas necesitaría este tipo de pirateo de señales, puedo simplificarlo un poco y simplemente usar la función de backtrace dentro del controlador de señales llamado que se ejecuta en el subproceso de destino (como también sugiere aquí sandeep ). Esto es básicamente lo que está haciendo mi implementación.

Si también está interesado en imprimir el retroceso, es decir, obtenga información útil de depuración (nombre de la función, nombre de archivo del código fuente, número de línea del código fuente, ...), lea here acerca de un backtrace_symbols extendido basado en libbfd. O simplemente ver la fuente here .


gdb proporciona estas facilidades para depurar programas multi-hilo:

  • Notificación automática de nuevos hilos.
  • ''thread thread-id'', un comando para cambiar entre hilos
  • ''hilos de información'', un comando para consultar sobre los hilos existentes
  • ''thread apply [thread-id-list] [all] args'', un comando para aplicar un comando a una lista de hilos
  • puntos de ruptura específicos del hilo
  • ''set print thread-events'', que controla la impresión de mensajes al iniciar y salir de un hilo.
  • ''set libthread-db-search-path path'', que le permite al usuario especificar qué libthread_db usar si la opción predeterminada no es compatible con el programa.

Así que solo hay que ir al hilo requerido en GDB por cmd: ''thread thread-id''. Luego haga ''bt'' en ese contexto de hilo para imprimir el seguimiento de hilo.