Problema no java-8-oracle (1.8.0_66) com o PrintAssembly “Não foi possível carregar o hsdis-amd64.so”

20

Estou tentando executar meus programas com -XX:+PrintAssemblyopções, mas sempre recebo mensagens como:

Aviso da VM do servidor Java HotSpot (TM) de 64 bits: PrintAssembly está ativado; ativar DebugNonSafepoints para obter saída adicional Não foi possível carregar o hsdis-amd64.so; biblioteca não carregável; PrintAssembly está desativado

Eu baixei o hsdis-amd64.so do Kenai: https://kenai.com/projects/base-hsdis/downloads

Eu mesmo construí essa biblioteca com o projeto http://sourceforge.net/projects/fcml/files/fcml-1.1.1/ .

Eu coloquei em todos os lugares "o Google diz":

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

com nomes:

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

Eu tentei mesmo definir manualmente a exportação LD_LIBRARY_PATH=/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/

... e tudo por nada.

Não há mais resultados do Google, não há mais combinação das soluções acima :-(

Alguém poderia me ajudar?

Piotr Tarnowski
fonte

Respostas:

10

Primeiro instale libhsdis0-fcmlcomo descrito na outra resposta 1 :

sudo apt-get install libhsdis0-fcml

Isso o instala apenas no OpenJDK. No entanto, você está usando java-8-oracle, então você precisará copiá-lo para lá. Aqui está o comando exato de cópia que funcionou para mim:

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

Se isso ainda não estiver funcionando, você pode tentar stracever para onde javaestá olhando. Eu usei:

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

para obter uma saída 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

Você pode ver que os lugares e nomes que você estava tentando definitivamente estão entre os que o JDK pesquisa (no meu caso, provavelmente teria pesquisado mais lugares, mas parou porque o último local acima é onde encontrou o objeto compartilhado).

Observe que você definitivamente precisa do -fsinalizador, stracepois a JVM real é ativada como um processo filho do javacomando original .

Entre os problemas que stracepodem revelar, há um problema de permissões. Eu só precisava de permissões de leitura na biblioteca para o lançamento do usuário java.

Minha java -versionsaída:

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 é apenas uma maneira de obter um hsdis.soarquivo (presumivelmente funcionando) de uma maneira amigável para o gerenciador de pacotes. Você sempre pode baixá-lo diretamente de uma das várias fontes também.

BeeOnRope
fonte