problem z java-8-oracle (1.8.0_66) z PrintAssembly „Nie można załadować hsdis-amd64.so”

20

Próbuję uruchomić moje programy z -XX:+PrintAssemblyopcjami, ale zawsze otrzymuję komunikat:

64-bitowe ostrzeżenie maszyny wirtualnej serwera Java HotSpot ™: PrintAssembly jest włączony; włączenie DebugNonSafepoints w celu uzyskania dodatkowego wyniku Nie można załadować hsdis-amd64.so; nie można załadować biblioteki; PrintAssembly jest wyłączony

Pobrałem hsdis-amd64.so z Kenai: https://kenai.com/projects/base-hsdis/downloads

Sam zbudowałem tę bibliotekę za pomocą projektu http://sourceforge.net/projects/fcml/files/fcml-1.1.1/ .

Umieszczam to wszędzie „Google mówi”:

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

z imionami:

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

Próbowałem nawet ustawić eksport ręcznie LD_LIBRARY_PATH=/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/

... i wszystko za nic.

Nigdy więcej wyników Google, więcej kombinacji powyższych rozwiązań :-(

Czy ktoś może mi pomóc?

Piotr Tarnowski
źródło

Odpowiedzi:

10

Najpierw zainstaluj libhsdis0-fcmlzgodnie z opisem w drugiej odpowiedzi 1 :

sudo apt-get install libhsdis0-fcml

Instaluje to tylko dla OpenJDK. Jednak używasz java-8-oracle, więc musisz go tam skopiować. Oto dokładne polecenie kopiowania, które działało dla mnie:

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

Jeśli to nadal nie działa, możesz spróbować stracezobaczyć, gdzie javaszukasz. Użyłem:

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

aby uzyskać wynik w ten sposób:

[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

Widać, że miejsca i nazwy, które próbujesz, zdecydowanie należą do wyszukiwań JDK (w moim przypadku prawdopodobnie przeszukałby więcej miejsc, ale zatrzymał się, ponieważ ostatnia lokalizacja powyżej jest miejscem, w którym znalazł udostępniony obiekt).

Zauważ, że zdecydowanie potrzebujesz -fflagi, straceponieważ faktyczna JVM jest uruchamiana jako proces potomny oryginalnego javapolecenia.

Jednym z problemów, które stracemogą ujawnić, jest kwestia uprawnień. Potrzebowałem tylko odczytów w bibliotece do uruchomienia użytkownika java.

Moja java -versionprodukcja:

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 Naprawdę jest to tylko sposób na uzyskanie (prawdopodobnie działającego) hsdis.sopliku w przyjazny dla menedżera pakietów sposób. Zawsze możesz go pobrać bezpośrednio z jednego z różnych źródeł.

BeeOnRope
źródło