Java无法映射本机库

时间:2019-01-25 19:56:48

标签: java hdf5 dynamic-linking hdf

我遇到了Java试图加载.so对象但无法映射它的问题,因此它崩溃了。在这种情况下如何调试?

以下是命令(顺便尝试运行HDFView实用程序):

  

/ usr / lib / jvm / java-11-openjdk-amd64 // bin / java   -Djava.library.path = / usr / lib / jni /:/ usr / lib / x86_64-linux-gnu / -Dswing.systemlaf = com.sun.java.swing.plaf.gtk.GTKLookAndFeel -classpath / usr / share /java/jhdf.jar:/usr/share/java/jhdf5.jar:/usr/share/java/jhdfobj.jar:/usr/share/java/jhdf4obj.jar:/usr/share/java/jhdf5obj.jar :/usr/share/java/jhdfview.jar:/usr/share/java/jgraph.jar:/usr/share/java/slf4j-api.jar:/usr/share/java/slf4j-nop.jar   ncsa.hdf.view.HDFView -root / usr / share / doc / libjhdf-doc /

以下是错误输出:

  

线程“ main”中的异常java.lang.UnsatisfiedLinkError:   /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt_xawt.so:libxcb.so.1:   无法从共享对象映射段   java.base / java.lang.ClassLoader $ NativeLibrary.load0(本机方法)位于   java.base / java.lang.ClassLoader $ NativeLibrary.load(ClassLoader.java:2430)     在   java.base / java.lang.ClassLoader $ NativeLibrary.loadLibrary(ClassLoader.java:2487)     在   java.base / java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)     在java.base / java.lang.ClassLoader.loadLibrary(ClassLoader.java:2617)     在java.base / java.lang.Runtime.load0(Runtime.java:767)在   java.base / java.lang.System.load(System.java:1831)在   java.base / java.lang.ClassLoader $ NativeLibrary.load0(本机方法)位于   java.base / java.lang.ClassLoader $ NativeLibrary.load(ClassLoader.java:2430)     在   java.base / java.lang.ClassLoader $ NativeLibrary.loadLibrary(ClassLoader.java:2487)     在   java.base / java.lang.ClassLoader.loadLibrary0(ClassLoader.java:2684)     在java.base / java.lang.ClassLoader.loadLibrary(ClassLoader.java:2638)     在java.base / java.lang.Runtime.loadLibrary0(Runtime.java:829)在   java.base / java.lang.System.loadLibrary(System.java:1867)在   java.desktop / java.awt.Toolkit $ 3.run(Toolkit.java:1395)在   java.desktop / java.awt.Toolkit $ 3.run(Toolkit.java:1393)在   java.base / java.security.AccessController.doPrivileged(本机方法)     在java.desktop / java.awt.Toolkit.loadLibraries(Toolkit.java:1392)在   java.desktop / java.awt.Toolkit。(Toolkit.java:1425)在   java.desktop / java.awt.Component。(Component.java:621)

其他有趣的事实:

  • 在前面带有“ sudo”的命令运行相同的错误 但使用其他库。

  • 首先用“ sudo su”提升后运行相同的命令,将给出 没有错误,尽管该应用程序未按预期运行。

  • 这些库具有读取权限。我已经尝试过将它们提升到 执行权限,但这没有任何改变。

  • 在ValGrind中运行命令会产生大量的 充满投诉的输出,但最终运行了该应用程序而不是 崩溃。

  • 我在使用gdb附加到进程并提取时遇到麻烦 信息。

  • 我已经遍历了源代码glibc和openjdk11,但没有找到 洞察力。 Strace和ltrace似乎无济于事。

  • 许多SO问题涉及类路径和库路径问题,但是 这似乎不是问题。据我所知,它正在发现 库就好了,但是无法映射它们。

  • 该库位于未挂载noexec的文件系统中。

通过评论请求输出

来自ldd /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt_xawt.so

linux-vdso.so.1 (0x00007ffda2ffd000)
libgtk3-nocsd.so.0 => /usr/lib/x86_64-linux-gnu/libgtk3-nocsd.so.0 (0x00007f6efd9b0000)     
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6efd612000)   
libawt.so => /usr/lib/jvm/java-11-openjdk-amd64/lib/libawt.so (0x00007f6efd342000)  
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f6efd130000)     
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f6efcdf8000)   
libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f6efcbee000)   
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6efc9ea000)     
libXtst.so.6 => /usr/lib/x86_64-linux-gnu/libXtst.so.6 (0x00007f6efc7e4000)     
libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f6efc5d4000)     
libjava.so
    => /usr/lib/jvm/java-11-openjdk-amd64/lib/libjava.so (0x00007f6efc3a7000)   
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6efc188000)   
libc.so.6
    => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6efbd97000)     
/lib64/ld-linux-x86-64.so.2 (0x00007f6efde1a000)    
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f6efbb6f000)   
libjvm.so => not found  
libverify.so => /usr/lib/jvm/java-11-openjdk-amd64/lib/libverify.so (0x00007f6efb960000)    
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f6efb75c000)   
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f6efb556000)   
libjvm.so => not found  
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f6efb341000)    
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f6efb139000)

文件-L /usr/lib/x86_64-linux-gnu/libxcb.so.1的输出:

/usr/lib/x86_64-linux-gnu/libxcb.so.1: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=4cc7a1f024b6a0511ed01e149f2f198c2532e5fd, stripped

因为它说需要libjvm,所以我切换到了具有libjvm.so的openjdk-8。然后结果是

GLib (gthread-posix.c): Unexpected error from C library during 'malloc': Cannot allocate memory.  Aborting.

对此进行了响应,在调用中添加了-Xmx500M(使用任一Java版本),并且该命令运行时没有诊断。但是,该应用程序无法正常工作。例如,我能够查看HDF5文件,但它声称文件不为空。它还不能创建新文件,这两个文件都是此应用程序的标准功能。因此,我不确定是否只是掩盖了问题或解决了问题。

0 个答案:

没有答案