web-dev-qa-db-fra.com

Problème java-8-Oracle (1.8.0_66) avec PrintAssembly "Impossible de charger hsdis-AMD64.so"

J'essaie d'exécuter mes programmes avec les options -XX:+PrintAssembly mais je reçois toujours un message du type:

Serveur Java HotSpot (TM) 64 bits VM warning: 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 fichier hsdis-AMD64.so depuis Kenai: https://kenai.com/projects/base-hsdis/downloads

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

Je le mets partout "dit Google":

/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 pour rien.

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

Quelqu'un pourrait-il m'aider?

18
Piotr Tarnowski

Installez d'abord libhsdis0-fcml comme décrit dans le autre réponse1:

Sudo apt-get install libhsdis0-fcml

Cela ne l'installe que pour OpenJDK. Cependant, vous utilisez Java-8-Oracle, vous 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 un strace pour voir où se trouve votre Java. J'ai utilisé:

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

pour obtenir une sortie comme ceci:

[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 avez essayés sont certainement parmi ceux recherchés par le JDK (dans mon cas, il aurait probablement recherché plus de lieux, mais s’est arrêté puisque le dernier emplacement ci-dessus est celui où l’objet partagé a été trouvé).

Notez que vous avez certainement besoin de l'indicateur -f sur strace car la machine virtuelle Java réelle est lancée en tant que processus enfant de la commande originale Java.

Parmi les problèmes que strace pourrait révéler, il y a un problème d'autorisations. Je n'avais besoin que de permanences de lecture sur la bibliothèque pour que l'utilisateur lance Java.

Ma sortie Java -version:

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 En réalité, il s’agit simplement d’un moyen d’obtenir un fichier (probablement fonctionnel) hsdis.so de manière conviviale pour le gestionnaire de paquets. Vous pouvez toujours le télécharger directement depuis l’une des sources.

9
BeeOnRope

Installez le paquet libhsdis0-fcml:

apt-get install libhsdis0-fcml

Il devrait fournir toutes les bibliothèques nécessaires (voir http://packages.ubuntu.com/xenial/AMD64/libhsdis0-fcml/filelist )

3
Kamil