java-8-oracle (1.8.0_66) masalah dengan PrintAssembly "Tidak dapat memuat hsdis-amd64.so"

20

Saya mencoba menjalankan program dengan -XX:+PrintAssemblyopsi tetapi saya selalu menerima pesan seperti:

Peringatan Java HotSpot (TM) 64-Bit Server VM: PrintAssembly diaktifkan; menyalakan DebugNonSafepoints untuk mendapatkan output tambahan Tidak dapat memuat hsdis-amd64.so; perpustakaan tidak dapat dimuat; PrintAssembly dinonaktifkan

Saya mengunduh hsdis-amd64.so dari Kenai: https://kenai.com/projects/base-hsdis/downloads

Saya telah membangun perpustakaan ini sendiri dengan proyek http://sourceforge.net/projects/fcml/files/fcml-1.1.1/ .

Saya taruh di mana-mana "kata 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/

dengan nama:

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

Saya telah mencoba bahkan mengatur ekspor secara manual LD_LIBRARY_PATH=/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/

... dan semuanya gratis.

Tidak ada lagi hasil Google, tidak ada lagi kombinasi solusi di atas :-(

Adakah yang bisa membantu saya?

Piotr Tarnowski
sumber

Jawaban:

10

Pertama instal libhsdis0-fcmlseperti yang dijelaskan dalam jawaban lain 1 :

sudo apt-get install libhsdis0-fcml

Ini hanya menginstalnya untuk OpenJDK. Namun, Anda menggunakan java-8-oracle, jadi Anda harus menyalinnya di sana. Inilah perintah salin tepat yang bekerja untuk saya:

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

Jika itu masih tidak berhasil, Anda dapat mencoba stracemelihat di mana Anda javamelihat. Saya menggunakan:

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

untuk mendapatkan output seperti ini:

[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

Anda dapat melihat bahwa tempat dan nama yang Anda coba pasti berada di antara pencarian JDK (dalam kasus saya, itu mungkin akan mencari lebih banyak tempat, tetapi berhenti karena lokasi terakhir di atas adalah tempat ia menemukan objek yang dibagikan).

Perhatikan bahwa Anda benar-benar membutuhkan -fbendera stracesejak JVM yang sebenarnya diluncurkan sebagai proses anak dari javaperintah asli .

Di antara masalah yang stracemungkin terungkap adalah masalah izin. Saya hanya perlu izin baca di perpustakaan untuk peluncuran pengguna java.

java -versionOutput saya :

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 Sungguh, ini hanya cara untuk mendapatkan file (mungkin berfungsi) hsdis.sodengan cara yang ramah paket-manajer. Anda selalu dapat mengunduhnya langsung dari salah satu dari berbagai sumber juga.

BeeOnRope
sumber