如何解决从 IntelliJ 运行时,Java 每隔几秒钟输出一次完整线程转储,并使用 setcap 授予网络嗅探权限
我正在编写一个使用 Pcap 库进行数据包嗅探的应用程序。为此,我需要提供 java
二进制网络嗅探功能,以避免将其作为 root
运行:
sudo setcap cap_net_raw,cap_net_admin=eip /path/to/bin/java
当我运行任何程序时,每隔几秒钟,我就会收到一个完整的线程转储到 stdout
。 Here 是这种完整线程转储的示例(repo 的其余部分无关紧要)。程序在其他方面似乎运行成功:除了转储之外,我找不到执行中的差异。
以下代码足以重现该问题:
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
我不确定这是不是有问题,因为程序似乎运行良好,但它看起来不正常。
我还没有发现任何人似乎有类似的问题,我有点迷茫...
感谢任何帮助,提前致谢!
详情:
- 操作系统:在 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。
解决方法
我还在 Reddit 上发布了我的问题,有人建议在进程收到信号 3 时显示这种完整的线程转储。
我无法使用 strace
检测到发送给它的信号,但我确实注意到在命令行而不是在我的 IDE 中运行代码解决了这个问题。
我还尝试向在命令行中运行的程序发送信号 3,它确实显示了相同的完整线程转储。
有点不令人满意的结局,我不是 100% 确定发生了什么,但我确信这是一个我可以忽略的非问题。
,如果 intelliJ 认为您的软件卡住了,它将从中获取线程转储。 System.in.read();
使它在从 stdin 读取时“卡住”。
您应该可以在 VM options 中使用 -Dperformance.watcher.unresponsive.interval.ms=0
禁用它。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。