problema de java-8-oracle (1.8.0_66) con PrintAssembly "No se pudo cargar hsdis-amd64.so"

20

Estoy tratando de ejecutar mis programas con -XX:+PrintAssemblyopciones, pero siempre recibo mensajes como:

Advertencia de máquina virtual de servidor Java HotSpot (TM) de 64 bits: PrintAssembly está habilitado; activar DebugNonSafepoints para obtener una salida adicional No se pudo cargar hsdis-amd64.so; biblioteca no cargable; PrintAssembly está deshabilitado

Descargué hsdis-amd64.so de Kenai: https://kenai.com/projects/base-hsdis/downloads

Yo mismo he creado esta biblioteca con http://sourceforge.net/projects/fcml/files/fcml-1.1.1/ project.

Lo pongo en todas partes "Google dice":

/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/

con nombres:

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

He intentado incluso configurar manualmente la exportación LD_LIBRARY_PATH=/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/

... y todo por nada.

No más resultados de Google, no más combinación de las soluciones anteriores :-(

¿Alguien me puede ayudar?

Piotr Tarnowski
fuente

Respuestas:

10

Primero instale libhsdis0-fcmlcomo se describe en la otra respuesta 1 :

sudo apt-get install libhsdis0-fcml

Esto solo lo instala para OpenJDK. Sin embargo, está utilizando java-8-oracle, por lo que deberá copiarlo allí. Aquí está el comando de copia exacto que funcionó para mí:

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 eso todavía no funciona, puede intentar stracever dónde javaestá mirando. Solía:

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

para obtener una salida como esta:

[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

Puedes ver que los lugares y nombres que estabas intentando están definitivamente entre los que busca JDK (en mi caso, probablemente habría buscado más lugares, pero se detuvo ya que la última ubicación anterior es donde encontró el objeto compartido).

Tenga en cuenta que definitivamente necesita el -findicador straceya que la JVM real se inicia como un proceso secundario del javacomando original .

Entre los problemas que stracepuede revelar hay un problema de permisos. Solo necesitaba permisos de lectura en la biblioteca para el inicio del usuario java.

Mi java -versionsalida:

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 Realmente, esta es solo una forma de obtener un hsdis.soarchivo (presumiblemente funcionando) de una manera amigable para el administrador de paquetes. Siempre puede descargarlo directamente de una de las diversas fuentes también.

BeeOnRope
fuente