我正在编写一个使用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。
2条答案
按热度按时间dauxcl2d1#
我还在reddit上发布了我的问题,有人建议在进程收到信号3时显示这样的完整线程转储。
我无法通过使用来检测发送给它的信号
strace
,但我确实注意到,在命令行中而不是在ide中运行代码解决了这个问题。我还尝试向在命令行中运行的程序发送一个信号3,它确实显示了相同的完整线程转储。
有点令人不满意的结局,我不是100%确定发生了什么,但我有信心这不是一个我可以忽略的问题。
093gszye2#
如果intellij认为您的软件卡住了,它将从中获取线程转储。
System.in.read();
使其在从stdin读取时“卡住”。您应该能够使用禁用它
-Dperformance.watcher.unresponsive.interval.ms=0
在虚拟机选项中。参考:intellij支持:禁用“自动线程转储”。