2 votes

Java produit un Full Thread Dump toutes les quelques secondes lorsqu'il est exécuté à partir d'IntelliJ et qu'il dispose de permissions de reniflage de réseau avec setcap.

J'écris une application qui fait du sniffing de paquets en utilisant une bibliothèque Pcap. Pour que cela fonctionne, je dois donner à la bibliothèque java des capacités binaires de reniflage de réseau afin d'éviter d'avoir à l'exécuter en tant que root :

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

Lorsque j'exécute un programme, toutes les quelques secondes, j'obtiens un Full Thread Dump (vidage complet du fil de discussion) vers stdout . Aquí est un exemple d'un tel vidage complet de thread (le reste du repo n'est pas pertinent). Pour le reste, le programme semble fonctionner correctement : à l'exception du dump, je n'ai pas trouvé de différence dans l'exécution.

Le code ci-dessous suffit à reproduire le problème :

package main;

import java.io.IOException;

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

Lorsque je supprime les capacités de la java binaire avec la commande ci-dessous, les choses reviennent à la normale et je n'obtiens plus les Full Thread Dumps sur stdout.

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

Je ne suis pas sûr qu'il s'agisse d'un problème car le programme semble fonctionner correctement, mais il n'a pas l'air d'aller bien. normal .

Je n'ai trouvé personne qui semble avoir un problème similaire, je suis un peu perdu...

Toute aide est la bienvenue, merci d'avance !


Détails :

  • OS : reproduit sur ArchLinux (noyau 5.12.9) & Ubuntu 20.04 (noyau 5.8.0)
  • JDK : reproduit sur Adopt OpenJDK 11, 15 & 16, openjdk.java.net 15 & 16.

EDIT :

Non reproductible si le programme est exécuté en ligne de commande :

java -classpath target/classes main.StdinTest

Je n'obtiens les symptômes que lorsque je le démarre depuis IntelliJ Idea Ultimate. Je n'ai pas essayé avec d'autres IDE.

2voto

Alfred456654 Points 113

J'ai également posé ma question sur Reddit et quelqu'un a suggéré que ces vidages complets de threads soient affichés lorsque le processus reçoit un signal 3.

Je n'ai pas réussi à détecter ce signal en utilisant la fonction strace mais j'ai remarqué que l'exécution du code en ligne de commande plutôt que dans mon IDE résolvait le problème.

J'ai également essayé d'envoyer un signal 3 au programme qui s'exécute en ligne de commande, et il affiche le même vidage complet du fil de discussion.

Fin un peu insatisfaisante, je ne suis pas sûr à 100 % de ce qui se passe, mais je commence à croire qu'il s'agit d'un problème que je peux ignorer.

1voto

eis Points 14687

Si intelliJ pense que votre logiciel est bloqué, il prendra des thread dumps de celui-ci. System.in.read(); le rend "bloqué" sur la lecture de stdin.

Vous devriez pouvoir le désactiver en utilisant -Dperformance.watcher.unresponsive.interval.ms=0 en Options VM .

Référence : support intellij : Désactiver "Automatic thread dumps" .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X