java-8-oracle (1.8.0_66) problème avec PrintAssembly "Impossible de charger hsdis-amd64.so"

20

J'essaie d'exécuter mes programmes avec des -XX:+PrintAssemblyoptions mais je reçois toujours des messages comme:

Avertissement de VM de serveur Java HotSpot (TM) 64 bits: PrintAssembly est activé; activer DebugNonSafepoints pour obtenir une sortie supplémentaire Impossible de charger hsdis-amd64.so; bibliothèque non chargeable; PrintAssembly est désactivé

J'ai téléchargé le hsdis-amd64.so depuis Kenai: https://kenai.com/projects/base-hsdis/downloads

J'ai moi-même construit cette bibliothèque avec le projet http://sourceforge.net/projects/fcml/files/fcml-1.1.1/ .

Je l'ai mis partout "google dit":

/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/
/usr/lib/jvm/java-8-oracle/jre/lib/amd64/
/usr/lib/jvm/java-8-oracle/lib/amd64/

avec des noms:

hsdis-amd64.so
libhsdis-amd64.so
hsdis.so
libhsdis.so

J'ai même essayé d'exporter manuellement LD_LIBRARY_PATH=/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/

... et tout ça pour rien.

Plus de résultats Google, plus de combinaison des solutions ci-dessus :-(

Quelqu'un peut-il m'aider?

Piotr Tarnowski
la source

Réponses:

10

Installez d'abord libhsdis0-fcmlcomme décrit dans l' autre réponse 1 :

sudo apt-get install libhsdis0-fcml

Cela l'installe uniquement pour OpenJDK. Vous utilisez cependant, java-8-oraclevous devrez donc le copier là-bas. Voici la commande de copie exacte qui a fonctionné pour moi:

sudo cp /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/hsdis-amd64.so /usr/lib/jvm/java-8-oracle/jre/lib/amd64/hsdis-amd64.so

Si cela ne fonctionne toujours pas, vous pouvez essayer stracede voir où vous javacherchez. J'ai utilisé:

strace -f java -XX:CompileCommand='print, *.*' ... |& grep hsdis

pour obtenir une sortie comme celle-ci:

[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libhsdis-amd64.so", O_RDONLY <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libhsdis-amd64.so", O_RDONLY|O_CLOEXEC <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/libhsdis-amd64.so", O_RDONLY|O_NONBLOCK <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/hsdis-amd64.so", O_RDONLY <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/hsdis-amd64.so", O_RDONLY|O_CLOEXEC <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/hsdis-amd64.so", O_RDONLY|O_NONBLOCK <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/hsdis-amd64.so", O_RDONLY <unfinished ...>
[pid 10783] open("/usr/lib/jvm/java-8-oracle/jre/lib/amd64/hsdis-amd64.so", O_RDONLY|O_CLOEXEC) = 14

Vous pouvez voir que les lieux et les noms que vous essayez sont certainement parmi ceux que le JDK recherche (dans mon cas, il aurait probablement cherché plus d'endroits, mais s'est arrêté depuis le dernier emplacement ci-dessus où il a trouvé l'objet partagé).

Notez que vous avez absolument besoin de l' -findicateur stracecar la JVM réelle est lancée en tant que processus enfant de la javacommande d' origine .

Parmi les problèmes stracesusceptibles de révéler, il y a un problème d'autorisations. Je n'avais besoin que de perm de lecture sur la bibliothèque pour le lancement de l'utilisateur java.

Ma java -versionsortie:

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

1 Vraiment, ce n'est qu'un moyen d'obtenir un hsdis.sofichier (vraisemblablement fonctionnel) d'une manière conviviale pour le gestionnaire de paquets. Vous pouvez toujours le télécharger directement à partir de l'une des différentes sources.

BeeOnRope
la source