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

Alf*_*654 8 java linux dump intellij-idea

我正在编写一个使用 Pcap 库进行数据包嗅探的应用程序。为了实现这一点,我需要提供java二进制网络嗅探功能,以避免必须将其运行为root

sudo setcap cap_net_raw,cap_net_admin=eip /path/to/bin/java
Run Code Online (Sandbox Code Playgroud)

当我运行任何程序时,每隔几秒钟,我就会得到一个完整线程转储到stdout. 是此类完整线程转储的示例(存储库的其余部分不相关)。否则该程序似乎运行成功:除了转储之外,我找不到执行中的差异。

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

package main;

import java.io.IOException;

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

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

sudo setcap -r /path/to/bin/java
Run Code Online (Sandbox Code Playgroud)

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

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

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


细节:

  • 操作系统:在ArchLinux(内核5.12.9)和Ubuntu 20.04(内核5.8.0)上复制
  • JDK:在 Adopt OpenJDK 11、15 和 16、openjdk.java.net 15 和 16 上复制。

编辑

如果程序在命令行中运行,则无法重现:

java -classpath target/classes main.StdinTest
Run Code Online (Sandbox Code Playgroud)

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

eis*_*eis 2

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

您应该能够使用-Dperformance.watcher.unresponsive.interval.ms=0VM options禁用它。更改 JVM 选项的推荐方法是通过Help | Edit Custom VM Options操作。

参考:intellij support:禁用“自动线程转储”

  • 我将该选项添加到 IDE 的 VM 选项中,并重新启动以防万一,但这并没有改变问题。为了更加确定,我还将它添加到我的“idea.properties”文件中。不过还是谢谢你的建议! (2认同)