java - JNI应用程序挂起

标签 java c++ c hadoop java-native-interface

请帮助您如何调试 JNI 应用程序。

使用 jps 获取运行 jvm 的进程的 pid:

$ jps
8248                <- this is the pid of the process that was span up by a C++ application to run JNI stuff ... 
8335 Jps

现在我们可以将 gdb 连接到该堆栈。

$ gdb -p 8248
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-94.el7
....  /cut/   
(gdb)
(gdb) bt
#0  0x00007fddd9f141bd in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x00007fddd9f0fd02 in _L_lock_791 () from /lib64/libpthread.so.0
#2  0x00007fddd9f0fc08 in pthread_mutex_lock () from /lib64/libpthread.so.0
#3  0x00007fddda9f3e26 in mutexLock () from /opt/cloudera/parcels/CDH/lib64/libhdfs.so.0.0.0
#4  0x00007fddda9ed6f1 in setTLSExceptionStrings () from /opt/cloudera/parcels/CDH/lib64/libhdfs.so.0.0.0
#5  0x00007fddda9ec38c in printExceptionAndFreeV () from /opt/cloudera/parcels/CDH/lib64/libhdfs.so.0.0.0
#6  0x00007fddda9ec52d in printExceptionAndFree () from /opt/cloudera/parcels/CDH/lib64/libhdfs.so.0.0.0
#7  0x00007fddda9ed46b in getJNIEnv () from /opt/cloudera/parcels/CDH/lib64/libhdfs.so.0.0.0
#8  0x00007fddda9eee94 in hdfsBuilderConnect () from /opt/cloudera/parcels/CDH/lib64/libhdfs.so.0.0.0
#9  0x0000000000400950 in main ()

请注意,它卡在某种全局互斥锁中

我认为这个 gdb 回溯堆栈对于确定此问题的根本原因应该非常有用。

这应该是一个通用的 JNI 调试问题?如果您有兴趣,这里有跨越 JVM 进行 JNi 交互的 C 代码 - https://gist.github.com/Tagar/7c42f82f5538004bda2f4ea0b0e0adc5

java版本“1.8.0_141” gcc版本4.8.5 20150623(红帽4.8.5-11)(GCC)

运行时环境:

export LD_LIBRARY_PATH=$CDH/lib64:$JAVA_HOME/jre/lib/$OS_ARCH/server
export CLASSPATH=`hadoop classpath` 
export _JAVA_OPTIONS=-Xss1280m

感谢您提供任何线索。

此外,基于挂起的堆栈,它试图失败

#6  0x00007fddda9ec52d in printExceptionAndFree () from /opt/cloudera/parcels/CDH/lib64/libhdfs.so.0.0.0
#7  0x00007fddda9ed46b in getJNIEnv () from /opt/cloudera/parcels/CDH/lib64/libhdfs.so.0.0.0

但仍坚持尝试 printExceptionAndFreeV() -> setTLSExceptionStrings() -> mutexLock() 锁..

最佳答案

根本原因被发现是https://issues.apache.org/jira/browse/HDFS-11851

谢谢。

关于java - JNI应用程序挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46165641/

相关文章:

Java 应用程序在播放声音后崩溃

c++ - 编译器错误 MB_LEN_MAX 的假定值错误

c++ - Openmp for 循环 : static schedule with work unbalance

c - C 的公共(public)库是什么?

c - QSort 在 cmp 函数中返回错误(乱序?)的数字

java - 如何通过 Android 的 Drive API 读取 Google 表格内容?

java - 我应该如何使用 Hibernate 从 JPQL 查询中引用内部枚举(在实体中定义)?

java - java中有没有办法在运行时改变对象类?

c++ - 这段代码是否应该调用复制或移动构造函数

c - 使用 C 中的函数进行阶乘计算器