当前位置: 首页 > 面试题库 >

Linux上的Java System.loadLibrary调用冻结

胡俊弼
2023-03-14
问题内容

我有一个非常小的.so文件(可在此处找到:https
://docs.google.com/leaf?id=0B4MxFm-
ACB3INjhkMjhlNzktYzkxYy00Zjk5LTk0Y2MtZDE2MWQ2MzY1OWUy
&hl=zh_CN&
authkey =CMrJguwN)

我试图将其加载到RHEL上的Java中,而Java
main只是冻结(没有错误或异常)。我在LD_LIBRARY_PATH上有带有.so文件的目录,因此我知道它实际上是在尝试加载它。

有什么想法可以解决这个问题吗?

public class SmallTester {


    public static void main(String[] args){

        for(String s: System.getenv("LD_LIBRARY_PATH").split(":")){
            System.out.println(s);
        }

        System.loadLibrary("TestAda");

        System.out.println("Here");
    }
}

编辑:

根据下面的帖子,我做了一个跟踪。看起来像一遍又一遍地重复此调用(我不确定这是什么意思?):

[pid 31464] clock_gettime(CLOCK_MONOTONIC, {3605675, 624255544}) = 0
[pid 31464] gettimeofday({1306417113, 168967}, NULL) = 0
[pid 31464] clock_gettime(CLOCK_MONOTONIC, {3605675, 624435576}) = 0
[pid 31464] clock_gettime(CLOCK_MONOTONIC, {3605675, 624518205}) = 0
[pid 31464] gettimeofday({1306417113, 169216}, NULL) = 0
[pid 31464] clock_gettime(CLOCK_REALTIME, {1306417113, 169306590}) = 0
[pid 31464] futex(0x88b3f04, FUTEX_WAIT_PRIVATE, 1, {0, 49909410}) = -1 ETIMEDOUT (Connection timed out)

这是日志的完整版本:https : //docs.google.com/leaf?id=0B4MxFm-
ACB3IYzdhZWIwNWEtYjUzMS00NGM5LWEzZjQtYzMzOWE3MWNhYWQ0&hl=en_US&authkey=CJ-
Lv_wGG

EDIT2:我也尝试使用JNA加载库:

public class SmallTesterJNA {

    public interface CLibrary extends Library {

      CLibrary INSTANCE1 = (CLibrary)
      Native.loadLibrary("TestAda", //  <<< our library goes here
                         CLibrary.class);

    }

    public static void main(String[] args){

        for(String s: System.getenv("LD_LIBRARY_PATH").split(":")){
            System.out.println(s);
        }

        System.loadLibrary(CLibrary.INSTANCE1.toString());

        System.out.println("Here");
    }
}

这是输出。看起来非常相似:https : //docs.google.com/leaf?id=0B4MxFm-
ACB3IYzdhZWIwNWEtYjUzMS00NGM5LWEzZjQtYzMzOWE3MWNhYWQ0&hl=zh_CN&authkey=CJ-
Lv_wGG

编辑2:

这是我的gcore输出附加到该过程中..不知道这是在告诉我什么:

(no debugging symbols found)
(no debugging symbols found)
[Thread debugging using libthread_db enabled]
[New Thread 0xb7fb26c0 (LWP 8326)]
[New Thread 0x7fa8eb90 (LWP 8340)]
[New Thread 0x7fe2db90 (LWP 8339)]
[New Thread 0x7fe7eb90 (LWP 8338)]
[New Thread 0x7feffb90 (LWP 8337)]
[New Thread 0x800afb90 (LWP 8336)]
[New Thread 0x80100b90 (LWP 8335)]
[New Thread 0x80351b90 (LWP 8334)]
[New Thread 0x803a2b90 (LWP 8333)]
[New Thread 0x80423b90 (LWP 8332)]
[New Thread 0x8066db90 (LWP 8331)]
[New Thread 0x806eeb90 (LWP 8330)]
[New Thread 0x8076fb90 (LWP 8329)]
[New Thread 0x807f0b90 (LWP 8328)]
[New Thread 0xb7474b90 (LWP 8327)]
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
(no debugging symbols found)
0xb7fcd402 in __kernel_vsyscall ()
Saved corefile core.8326

问题答案:

如果我不得不猜测,我会说可能的罪魁祸首是共享库的初始化代码。

(使用gcoregdb获取JVM进程的核心转储,或进行附加操作以获取确切冻结位置的堆栈跟踪。



 类似资料:
  • 我知道有很多关于这个话题的问题,但我还是找不到一个解决办法。 我有一个应用程序,可以加载和显示图像(就像智能手机上的常规图库应用程序一样) 我加载了背景中的所有图像与协同线-在这个过程的这个阶段没有问题。 当我通知适配器有关数据时就会出现问题。notifyDataSetChanged()调用会冻结UI一段时间。 我们讨论的是相对较大的网格(例如1000+张照片) 其他线程中的几乎所有答案都建议,我

  • 问题内容: 我有一个程序在其中加载文件,同时显示一个窗口以通知用户正在加载文件。我决定制作一个FileLoader类,它是一个实际上处理了文件加载的SwingWorker类,以及一个实现PropertyChangeListener的ProgressWindow,用于通知用户传递给它的SwingWorker的状态。 我的代码当前如下所示: 问题是,每当我调用loader.get()时,它都会冻结GU

  • 我正在为一个班做一个基本的乒乓球游戏。我让Pong工作,启动时有一个GUI显示,不幸的是,我似乎无法从开始按钮启动游戏。我已经在代码上注释了问题所在,并删除了不相关的代码。 有什么想法吗?

  • 问题内容: 在Linux的通用x86用户态应用程序上,什么会导致SIGBUS(总线错误)?我在网上可以找到的所有讨论都与内存对齐错误有关,据我了解,这实际上并不适用于x86。 (我的代码在Geode上运行,以防那里存在任何相关的特定于处理器的怪癖。) 问题答案: 如果打开未对齐的访问陷阱,则可以从未对齐的访问中获取SIGBUS,但是通常在x86上是关闭的。如果出现某种错误,也可以通过访问内存映射的

  • 问题内容: 我的导航控制器会间歇性地在推送时冻结。似乎将新的视图控制器添加到堆栈中,但是动画从未发生。我还有另外两个在屏幕上保存视图控制器的容器,在导航控制器冻结后,我可以与它们进行交互。真正有趣的是,如果我尝试将另一个视图控制器推送到导航控制器的堆栈上,我会注意到堆栈顶部还有一个额外的视图控制器(我最初推送的视图控制器冻结了导航控制器)。因此,如果我在主屏幕上(我们将其称为VC- Home),并

  • 当数据被不可变地借用时,它还会冻结(freeze)。已冻结(frozen)数据无法通过原始对象来修改,直到指向这些数据的所有引用离开作用域为止。 fn main() { let mut _mutable_integer = 7i32; { // 借用 `_mutable_integer` let _large_integer = &_mutable_