除了Linux上的pthread_create之外还创建linux线程的方法

时间:2017-09-29 05:58:32

标签: c linux multithreading pthreads system-calls

我拦截了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作业。我想观察所有线程和进程及其关系

谢谢。

1 个答案:

答案 0 :(得分:1)

(从评论中移出)

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

直接系统调用无法轻易拦截,您通常需要内核本身的帮助 - 通常通过ptrace接口发生 - 顺便提一下,实现strace和调试器之类的东西。您应该特别关注PTRACE_O_TRACECLONEPTRACE_O_TRACEVFORKPTRACE_O_TRACEFORK选项以跟踪新进程/线程的创建,或直接PTRACE_SYSCALL来阻止所有系统调用。

ptrace的设置有点费力,我现在没有太多时间,但是在互联网上有几个基本的pthread循环的例子,你肯定能够找到/适应你的目标。