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
当我 运行 任何程序时,每隔几秒,我都会将完整线程转储到 stdout
。 Here 是此类完整线程转储的示例(回购协议的其余部分无关紧要)。该程序似乎 运行 成功:除了转储,我在执行中找不到任何区别。
下面的代码足以重现问题:
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
我不确定这是不是一个问题,因为该程序似乎 运行 正常,但看起来不正常 。
我还没有找到任何人似乎有类似的问题,我有点迷路...
感谢任何帮助,提前致谢!
详情:
- OS:转载于 ArchLinux(内核 5.12.9)和 Ubuntu20.04(内核 5.8.0)
- JDK:转载于 Adopt OpenJDK 11、15 & 16,openjdk.java.net 15 & 16。
编辑:
如果程序在命令行中 运行 则不可重现:
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
来禁用它。
在帮助中添加以下内容是否有帮助? 编辑自定义属性 并重新启动 IDE?
debugger.attach.to.process.action=false
execution.dump.threads.using.attach=false
发件人:Intellij keeps dumping threads when running simplest application with openjdk 11
我正在编写一个使用 Pcap 库进行数据包嗅探的应用程序。为此,我需要提供 java
二进制网络嗅探功能,以避免必须 运行 它作为 root
:
sudo setcap cap_net_raw,cap_net_admin=eip /path/to/bin/java
当我 运行 任何程序时,每隔几秒,我都会将完整线程转储到 stdout
。 Here 是此类完整线程转储的示例(回购协议的其余部分无关紧要)。该程序似乎 运行 成功:除了转储,我在执行中找不到任何区别。
下面的代码足以重现问题:
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
我不确定这是不是一个问题,因为该程序似乎 运行 正常,但看起来不正常 。
我还没有找到任何人似乎有类似的问题,我有点迷路...
感谢任何帮助,提前致谢!
详情:
- OS:转载于 ArchLinux(内核 5.12.9)和 Ubuntu20.04(内核 5.8.0)
- JDK:转载于 Adopt OpenJDK 11、15 & 16,openjdk.java.net 15 & 16。
编辑:
如果程序在命令行中 运行 则不可重现:
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
来禁用它。
在帮助中添加以下内容是否有帮助? 编辑自定义属性 并重新启动 IDE?
debugger.attach.to.process.action=false
execution.dump.threads.using.attach=false
发件人:Intellij keeps dumping threads when running simplest application with openjdk 11