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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.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
Java 多线程、带停止和继续信号的多处理_Java_Multithreading_Signals_Ptrace - Fatal编程技术网

Java 多线程、带停止和继续信号的多处理

Java 多线程、带停止和继续信号的多处理,java,multithreading,signals,ptrace,Java,Multithreading,Signals,Ptrace,我正在从事一个项目,在那里我需要获得Java应用程序的本机堆栈。我能够部分实现这一点。多亏了ptrace/多处理和信号 在Linux上,普通java应用程序至少有14个线程。在这14个线程中,我只对我必须获得本机堆栈的主线程感兴趣。考虑到这个目标,我使用fork()启动了一个单独的进程,该进程监视主线程的本机堆栈。简言之,我有两个独立的过程:一个被监控,另一个使用ptrace和信号处理进行监控 监测过程中的步骤: 1) 从进程的其他14个线程中获取主线程id 2) ptrace_连接主识别码 3

我正在从事一个项目,在那里我需要获得Java应用程序的本机堆栈。我能够部分实现这一点。多亏了ptrace/多处理和信号

在Linux上,普通java应用程序至少有14个线程。在这14个线程中,我只对我必须获得本机堆栈的主线程感兴趣。考虑到这个目标,我使用fork()启动了一个单独的进程,该进程监视主线程的本机堆栈。简言之,我有两个独立的过程:一个被监控,另一个使用ptrace和信号处理进行监控

监测过程中的步骤:

1) 从进程的其他14个线程中获取主线程id

2) ptrace_连接主识别码

3) ptrace_cont main_ID

连续循环开始

{

4) 杀死(主标识,信号停止)

5) 从/proc/[pid]/stat-dir中进行nanosleep和检查状态

6) ptrace_peek读取堆栈和导航的数据

7) ptrace_cont main_ID

8) 从/proc/[pid]/stat-dir中进行nanosleep和检查状态

}

9) ptrace_分离主_ID

这完美地连续提供了本机堆栈信息。但有时我会面临一个问题

问题:

当我将kill(main_ID,SIGSTOP)发送到主线程时,进程中的其他线程将进入finished或stoped状态(T),并且整个进程将被阻塞。这不是一致性行为,整个过程执行正确。我无法理解这种行为,因为我只是在向主线程发送信号,为什么其他线程会受到影响? 有人能帮我分析一下这个问题吗

我还尝试在进程的所有线程上执行CONT和STOP信号,但有时仍然会出现问题


谢谢,Sandeep

假设您使用的是Linux,那么您应该使用tkill(2)或tgkill(2)而不是kill(2)。在FreeBSD上,应该使用SYS\u thr\u kill2系统调用。根据tkill(2)手册页:

tgkill()将信号sig发送到线程ID为tid的线程 线程组tgid。(相比之下,kill(2)只能用于发送 整个进程(即线程组)的信号,以及 将被传递到该进程中的任意线程。)

忽略关于tkill(2)和friends的内容对于内部线程库的使用,调试器/跟踪器通常使用它向特定线程发送信号

另外,您应该使用waitpid(2)(或它的一些变体)来等待线程接收SIGSTOP,而不是在/proc/[pid]/stat上轮询。这种方法将更有效,响应也更迅速


最后,您似乎正在进行某种堆栈采样。您可能想检查一下,因为这些工具包括一个CPU采样器,它正在进行堆栈采样,以获得哪些函数消耗的CPU时间最多的估计值。您可以重用这些工具已经完成的工作,因为堆栈采样可能很难保持健壮。

根据我目前的理解,在流程级别上有一个与信号对应的默认信号处理程序。当进程为其任何子线程找到信号时,根据状态(即忙或空闲),相应的信号由任何一个线程处理。这可能是我的结果不一致的原因。