Utiliser pthreads s'il y a un moyen "intelligent" d'obtenir tous les threadID
créés en utilisant pthread_created
dans un processus, en supposant que ces threads sont créés dans la bibliothèque tierce qui n'expose pas ces données.Obtenir tous les thread_id créés avec pthread_created dans un processus
Répondre
Une façon de le faire est de créer une fonction de remplacement pour pthread_create et d'utiliser LD_PRELOAD. Bien sûr, vous ne voulez pas réimplémentez pthread_create, donc vous devez pthread_create en quelque sorte, mais vous pouvez demander au chargeur dynamique pour le charger pour vous:
#define _GNU_SOURCE
#include <stdio.h>
#include <stdint.h>
#include <bits/pthreadtypes.h>
#include <dlfcn.h>
void store_id(pthread_t * id) {
fprintf(stderr, "new thread created with id 0x%lx\n", (*id));
}
#undef pthread_create
int pthread_create(pthread_t * thread, pthread_attr_t * attr, void * (*start)(void *), void * arg)
{
int rc;
static int (*real_create)(pthread_t * , pthread_attr_t *, void * (*start)(void *), void *) = NULL;
if (!real_create)
real_create = dlsym(RTLD_NEXT, "pthread_create");
rc = real_create(thread, attr, start, arg);
if(!rc) {
store_id(thread);
}
return rc;
}
Ensuite, vous compilez à une bibliothèque partagée:
gcc -shared -ldl -fPIC pthread_interpose.c -o libmypthread.so
Et vous pouvez l'utiliser avec un prog lié dynamiquement:
LD_PRELOAD=/path/to/libmypthread.so someprog
note: Ceci est une version adpated de cette blog post
Il n'existe aucun moyen standard dans l'API pthreads pour récupérer la liste des threads. Ce que vous pouvez faire est de plonger dans le code source de "ps" ou "top" et voir comment c'est fait. Vous pouvez trouver le code source dans le procps library.
Lire la liste des dossiers dans/proc/[votre-processus pid]/tâche
Ceci est un répertoire qui contient un sous-répertoire pour chaque thread dans le processus.