Java-8-Oracle (1.8.0_66) Problem mit PrintAssembly "Konnte hsdis-amd64.so nicht laden"

20

Ich versuche, meine Programme mit -XX:+PrintAssemblyOptionen auszuführen, erhalte jedoch immer die Meldung:

Java HotSpot (TM) 64-Bit-Server-VM-Warnung: PrintAssembly ist aktiviert. Aktivieren von DebugNonSafepoints, um zusätzliche Ausgabe zu erhalten. hsdis-amd64.so konnte nicht geladen werden. Bibliothek nicht ladbar; PrintAssembly ist deaktiviert

Ich habe die Datei hsdis-amd64.so von Kenai heruntergeladen: https://kenai.com/projects/base-hsdis/downloads

Ich habe diese Bibliothek selbst mit dem Projekt http://sourceforge.net/projects/fcml/files/fcml-1.1.1/ erstellt .

Ich setze es überall "google says":

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

mit namen:

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

Ich habe mal versucht den Export manuell einzustellen LD_LIBRARY_PATH=/usr/lib/jvm/java-8-oracle/jre/lib/amd64/server/

... und das alles umsonst.

Keine weiteren Google-Ergebnisse, keine weiteren Kombinationen der oben genannten Lösungen :-(

Kann mir jemand helfen?

Piotr Tarnowski
quelle

Antworten:

10

Installieren Sie zuerst libhsdis0-fcmlwie in der anderen Antwort 1 beschrieben :

sudo apt-get install libhsdis0-fcml

Dies installiert es nur für OpenJDK. Sie verwenden jedoch, java-8-oracleso dass Sie es dort kopieren müssen. Hier ist der genaue Kopierbefehl, der bei mir funktioniert hat:

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

Wenn das immer noch nicht funktioniert, können Sie versuchen, stracezu sehen, wo Sie javasuchen. Ich benutzte:

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

So erhalten Sie die Ausgabe:

[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

Sie können sehen, dass die Orte und Namen, die Sie ausprobiert haben, definitiv zu den von JDK durchsuchten gehören (in meinem Fall hätte es wahrscheinlich mehr Orte durchsucht, aber angehalten, da sich der letzte Ort oben dort befindet, wo das gemeinsam genutzte Objekt gefunden wurde).

Beachten Sie, dass Sie das -fFlag unbedingt benötigen , straceda die eigentliche JVM als untergeordneter Prozess des ursprünglichen javaBefehls gestartet wird .

Unter den stracemöglicherweise aufgedeckten Problemen befindet sich ein Berechtigungsproblem. Ich brauchte nur Leserechte für die Bibliothek, um den Benutzer zu starten java.

Meine java -versionAusgabe:

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 In Wirklichkeit ist dies nur eine Möglichkeit, eine (vermutlich funktionierende) hsdis.soDatei paketmanagerfreundlich abzurufen. Sie können es auch jederzeit direkt von einer der verschiedenen Quellen herunterladen.

BeeOnRope
quelle