Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux ptrace和线程_Linux_Multithreading_Linux Kernel_System Calls_Ptrace - Fatal编程技术网

Linux ptrace和线程

Linux ptrace和线程,linux,multithreading,linux-kernel,system-calls,ptrace,Linux,Multithreading,Linux Kernel,System Calls,Ptrace,我正在开发一个包含ptrace的linux应用程序,以观察另一个进程的线程。当我观察到的应用程序分叉一个子进程时,这已经非常有效了。通过在我的应用程序中调用waitpid,我可以在观察应用程序中获得以下信号: SIGSTOP形成子进程 SIGTRAP来自父级 为了跟踪所有的孩子,我用ptrace\u O\u TRACEFORK,ptrace\u TRACEFORK,ptrace\u TRACECLONE和ptrace\u TRACEEXIT设置了ptrace 虽然子进程的一切都很好,但我无法

我正在开发一个包含ptrace的linux应用程序,以观察另一个进程的线程。当我观察到的应用程序分叉一个子进程时,这已经非常有效了。通过在我的应用程序中调用waitpid,我可以在观察应用程序中获得以下信号:

  • SIGSTOP
    形成子进程
  • SIGTRAP
    来自父级
为了跟踪所有的孩子,我用
ptrace\u O\u TRACEFORK
ptrace\u TRACEFORK
ptrace\u TRACECLONE
ptrace\u TRACEEXIT
设置了ptrace

虽然子进程的一切都很好,但我无法观察应用程序的线程。我从创建线程的进程中得到了
SIGTRAP
,但没有从线程中得到任何信号

线程和
ptrace
有什么特别之处吗?
strace
如何跟踪线程(我在
strace
的代码中找不到任何专门用于线程的特殊例程)

这是我在应用程序中使用
ptrace
的方式:

  • 首先我附加到一个进程:
    ptrace(ptrace\u attach,pid,NULL,NULL)
  • 然后,我调用
    waitpid()
    trace\u pid=waitpid(-1,&status,0)
  • 设置
    ptrace
    选项:
    ptrace(ptrace_SETOPTIONS,pid,NULL,ptrace_O_TRACEFORK | ptrace_O_TRACEFORK | ptrace_O_TRACECLONE | ptrace_O_TRACEEXIT)

连接到pid后,我在循环中调用
waitpid()
,并调用
ptrace(PTRACE_SETOPTIONS…
对于
PTRACE
报告的每个新任务。当然,在事件处理之后,我使用
SIGCONT
继续任务。

最后,我自己找到了解决方案:我通过调用

waitpid(-1, &status, __WALL)
而不是

waitpid(-1, &status, 0)

我想我已经接近了问题的核心:当创建一个新线程时,我甚至没有在观察过程中收到sigstop。然而,在ptrace文档中它说:“自动开始跟踪新克隆的进程,它将以sigstop开始。”这是怎么发生的?我已经使用procfs和一个使用posix线程的小应用程序做了一些进一步的调查。应用程序所做的只是启动一个新线程并休眠一段时间。新线程也会休眠几秒钟。正如我所说,我不会收到新线程的带有waitpid的sigstop。但是,procfs中的状态文件因为新线程告诉我:Name:thread\u测试状态:t(跟踪停止)Tgid:2538 Pid:2545 PPid:2395 TracerPid:2540所以新线程停止,但waitpid没有收到停止信号。跟踪线程的正确方法是什么?