gpt4 book ai didi

c - 除了 pthread_create 在 linux 上创建 linux 线程的方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:51 26 4
gpt4 key购买 nike

我拦截了 pthread_create 调用以捕获所有线程之间的关系。但是我发现只拦截pthread_create,有些线程的创建并没有被记录下来。我还尝试拦截 posix_spawn posix_spawnpclone 调用。但是仍然有一些我不知道是谁创建的线程在我的实验中运行。那么在linux上有没有其他创建线程的方法呢?

更具体地说,我使用LD_PRELOAD拦截pthread_create调用,代码片段如下:

int  pthread_create(pthread_t  *thread,  const pthread_attr_t  *attr,  void  *(*start_routine)(void  *),  void  *arg){
static void *handle = NULL;
static P_CREATE old_create=NULL;
if( !handle )
{
handle = dlopen("libpthread.so.0", RTLD_LAZY);
old_create = (P_CREATE)dlsym(handle, "pthread_create");
}
pthread_t tmp=pthread_self();
//print pthread_t pid

int result=old_create(thread,attr,start_routine,(void *)temp);
//print thread pid

return result;
}

就这样,我捕获了所有的线程创建过程。 clone 也是如此。但实际上 clone 并没有被应用程序调用。有时,我得到一个父子线程对,之前没有打印父线程。所以不知道有没有其他方法可以创建这个父线程。

更具体地说,上层应用是JVM1.7上的Mapreduce作业。我想观察所有线程和进程及其关系

谢谢。

最佳答案

(从评论中移出)

LD_PRELOAD 技巧只是让您拦截对外部库的 C 调用 - 在这种特殊情况下是 lptrhead(对于 pthread_create)和 libc(用于fork/clone);但是要创建线程,程序可以完全绕过它们并直接与内核对话,方法是使用 int 80h(在 x86 上)或 sysenter(在 amd64 上)。

直接的系统调用不能那么容易被拦截,你通常需要内核本身的帮助——这通常是通过 ptrace 接口(interface)发生的——顺便说一下,像 strace 这样的东西并实现了调试器。您应该特别查看 PTRACE_O_TRACECLONEPTRACE_O_TRACEVFORKPTRACE_O_TRACEFORK 选项以跟踪新进程/线程的创建,或直接 PTRACE_SYSCALL 阻止所有系统调用。

ptrace 的设置有点费力,我现在没有太多时间,但是在 Internet 上有几个基本 pthread 循环的示例,您一定可以找到/适应你的目标。

关于c - 除了 pthread_create 在 linux 上创建 linux 线程的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46482584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com