JNI 应用挂起

Posted

技术标签:

【中文标题】JNI 应用挂起【英文标题】:JNI application hanging 【发布时间】:2017-09-11 23:23:00 【问题描述】:

请帮助您如何调试 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 调试问题?如果您对这里的 C 代码感兴趣,它跨越 JVM 以进行 JNi 交互 - https://gist.github.com/Tagar/7c42f82f5538004bda2f4ea0b0e0adc5

java 版本“1.8.0_141” gcc 版本 4.8.5 20150623 (Red Hat 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()锁..

【问题讨论】:

@MahonriMoriancumer 编辑被拒绝。 JNI 代码是用 C 或 C++ 编写的。 OP 没有指定哪个,从堆栈跟踪中也不清楚。 【参考方案1】:

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

谢谢。

【讨论】:

以上是关于JNI 应用挂起的主要内容,如果未能解决你的问题,请参考以下文章

使用挂起异常java.lang.ClassNotFoundException调用JNI GetMethodID

执行任何 IO/流时 C++ JNI 崩溃/挂起

Java Tomcat Web 应用程序 JNI

如何使用 Eclipse TPTP 分析 JNI 应用程序?

JNI应用

AndroidX没有找到类“android.support.v4.content.ContextCompat