Java 当 运行 来自 IntelliJ 并使用 setcap 给予网络嗅探权限时,每隔几秒输出一次完整的线程转储

Java outputs a Full Thread Dump every few seconds when running from IntelliJ and given network sniffing permissions with setcap

我正在编写一个使用 Pcap 库进行数据包嗅探的应用程序。为此,我需要提供 java 二进制网络嗅探功能,以避免必须 运行 它作为 root:

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

当我 运行 任何程序时,每隔几秒,我都会将完整线程转储到 stdoutHere 是此类完整线程转储的示例(回购协议的其余部分无关紧要)。该程序似乎 运行 成功:除了转储,我在执行中找不到任何区别。

下面的代码足以重现问题:

package main;

import java.io.IOException;

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

当我使用下面的命令从 java 二进制文件中删除功能时,一切恢复正常,我不再将完整线程转储到标准输出。

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

我不确定这是不是一个问题,因为该程序似乎 运行 正常,但看起来不正常

我还没有找到任何人似乎有类似的问题,我有点迷路...

感谢任何帮助,提前致谢!


详情:


编辑:

如果程序在命令行中 运行 则不可重现:

java -classpath target/classes main.StdinTest

我只有在从 IntelliJ Idea Ultimate 启动它时才会出现这些症状。我还没有尝试过其他 IDE。

我还在 Reddit 上发布了我的问题,有人建议当进程收到信号 3 时显示这样的完整线程转储。

我无法检测到使用 strace 发送给它的信号,但我确实注意到 运行 命令行中的代码而不是 IDE 中的代码解决了问题。

我还尝试在命令行中向程序 运行 发送信号 3,它确实显示了相同的完整线程转储。

有点不尽如人意的结局,我不是 100% 确定发生了什么,但我越来越相信这不是我可以忽略的问题。

如果 intelliJ 认为您的软件卡住了,它会从中获取线程转储。 System.in.read(); 使其在从标准输入读取时“卡住”。

您应该可以使用 VM options 中的 -Dperformance.watcher.unresponsive.interval.ms=0 来禁用它。

参考:intellij support: Disable "Automatic thread dumps".

帮助中添加以下内容是否有帮助? 编辑自定义属性 并重新启动 IDE?

debugger.attach.to.process.action=false
execution.dump.threads.using.attach=false

发件人:Intellij keeps dumping threads when running simplest application with openjdk 11