web-dev-qa-db-ja.com

java-8-Oracle(1.8.0_66)PrintAssemblyの問題「hsdis-AMD64.soをロードできませんでした」

-XX:+PrintAssemblyオプションを使用してプログラムを実行しようとしていますが、次のようなメッセージが常に表示されます。

Java HotSpot(TM)64ビットサーバーVM警告:PrintAssemblyが有効になっています。 DebugNonSafepointsをオンにして追加の出力を取得しましたhsdis-AMD64.soをロードできませんでした。ライブラリはロードできません。 PrintAssemblyは無効です

Kenaiからhsdis-AMD64.soをダウンロードしました: https://kenai.com/projects/base-hsdis/downloads

私は http://sourceforge.net/projects/fcml/files/fcml-1.1.1/ プロジェクトでこのライブラリを自分で構築しました。

私はそれを「グーグルが言う」どこにでも置きます:

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

名前付き:

hsdis-AMD64.so
libhsdis-AMD64.so
hsdis.so
libhsdis.so

手動でエクスポートLD_LIBRARY_PATH=/usr/lib/jvm/Java-8-Oracle/jre/lib/AMD64/server/を設定しようとしました

...そしてすべてが無料です。

これ以上のグーグルは、上記のソリューションの組み合わせをもう生み出さない:-(

誰も私を助けることができますか?

18
Piotr Tarnowski

その他の回答 で説明されているように、最初にlibhsdis0-fcmlをインストールします1

Sudo apt-get install libhsdis0-fcml

これは、OpenJDK用にのみインストールします。ただし、Java-8-Oracleを使用しているため、そこにコピーする必要があります。私のために働いたexactコピーコマンドは次のとおりです:

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

それでも機能しない場合は、straceを試して、Javaがどこにあるかを確認してください。私が使用した:

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

次のような出力を取得するには:

[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

あなたが試みていた場所と名前は間違いなくJDKの検索の中にあることがわかります(私の場合、おそらくもっと多くの場所を検索したでしょうが、上の最後の場所は共有オブジェクトを見つけた場所なので停止しました)。

実際のJVMは元のstraceコマンドの子プロセスとして起動されるため、Javaには必ず-fフラグが必要です。

straceが明らかにする可能性のある問題の中に、権限の問題があります。 Javaを起動するユーザーのライブラリの読み取り権限のみが必要でした。

私の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 本当に、これは(おそらく動作している)hsdis.soファイルをパッケージマネージャーに優しい方法で取得するための単なる方法です。さまざまなソースの1つから直接ダウンロードすることもできます。

9
BeeOnRope

インストールパッケージlibhsdis0-fcml

apt-get install libhsdis0-fcml

必要なすべてのライブラリを提供する必要があります( http://packages.ubuntu.com/xenial/AMD64/libhsdis0-fcml/filelist を参照)

3
Kamil