java每隔几秒钟输出一次完整的线程转储,并使用setcap授予网络嗅探权限

ax6ht2ek  于 2021-09-29  发布在  Java
关注(0)|答案(2)|浏览(353)

我正在编写一个使用pcap库进行数据包嗅探的应用程序。为了让它发挥作用,我需要 java 二进制网络嗅探功能,以避免将其作为 root :

sudo setcap cap_net_raw,cap_net_admin=eip /path/to/bin/java

当我运行任何程序时,每隔几秒钟,我就会得到一个完整的线程转储 stdout . 下面是这样一个完整线程转储的示例(repo的其余部分无关紧要)。在其他方面,该程序似乎运行成功:除了转储之外,我在执行过程中没有发现任何差异。
以下代码足以重现问题:

package main;

import java.io.IOException;

public class StdinTest {
    public static void main(String[] args) throws IOException {
        System.in.read();
    }
}

当我从 java 使用下面的命令,一切恢复正常,我不再将完整的线程转储到stdout。

sudo setcap -r /path/to/bin/java

我不确定这是否是一个问题,因为该程序似乎运行良好,但看起来不正常。
我还没有找到任何人有类似的问题,我有点迷路了。。。
感谢您的帮助,提前谢谢!
细节:
操作系统:在archlinux(内核5.12.9)和ubuntu 20.04(内核5.8.0)上复制
jdk:复制于openjdk 11、15和16、openjdk.java.net 15和16。
编辑:
如果程序在命令行中运行,则不可复制:

java -classpath target/classes main.StdinTest

我只在从intellij idea ultimate开始时才会出现症状。我没有尝试过其他IDE。

dauxcl2d

dauxcl2d1#

我还在reddit上发布了我的问题,有人建议在进程收到信号3时显示这样的完整线程转储。
我无法通过使用来检测发送给它的信号 strace ,但我确实注意到,在命令行中而不是在ide中运行代码解决了这个问题。
我还尝试向在命令行中运行的程序发送一个信号3,它确实显示了相同的完整线程转储。
有点令人不满意的结局,我不是100%确定发生了什么,但我有信心这不是一个我可以忽略的问题。

093gszye

093gszye2#

如果intellij认为您的软件卡住了,它将从中获取线程转储。 System.in.read(); 使其在从stdin读取时“卡住”。
您应该能够使用禁用它 -Dperformance.watcher.unresponsive.interval.ms=0 在虚拟机选项中。
参考:intellij支持:禁用“自动线程转储”。

相关问题