获取在进程中使用pthread_created创建的所有thread_id

时间:2010-09-14 08:54:04

标签: pthreads

如果有任何“智能”方法来获取在进程中使用threadID创建的所有pthread_created,请使用pthreads,假设这些线程是在第三方库中创建的,不会公开这些数据

3 个答案:

答案 0 :(得分:7)

一种方法是为pthread_create创建替换函数,并使用LD_PRELOAD。 当然你不想重新实现pthread_create,所以你必须以某种方式调用pthread_create,但你可以要求动态加载器为你加载它:

#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;
}

然后将其编译为共享库:

gcc -shared -ldl -fPIC pthread_interpose.c -o libmypthread.so

你可以将它用于任何动态链接的编程:

 LD_PRELOAD=/path/to/libmypthread.so someprog

注意:这是此blog post

的附加版本

答案 1 :(得分:2)

pthreads API中没有用于检索线程列表的标准方法。您可以做的是深入了解“ps”或“top”的源代码,看看它是如何完成的。您可以在procps library

中找到源代码

答案 2 :(得分:0)

阅读/ proc / [your-process-pid] / task

中的文件夹列表

这是一个目录,其中包含进程中每个线程的一个子目录。