JNI调用中的java堆栈不完整

时间:2014-12-03 04:07:15

标签: java java-native-interface stack

我在我的c应用程序中调用了hdfs的libhdfs接口,pstack提供了挂起线程的部分堆栈信息,如下所示:

#0 0x000000302b808b9f in pthread_cond_timedwait@@GLIBC_2.3.2 ()

#1 0x00007f3eac557666 in在此输入代码os::PlatformEvent::park ()

#2 0x00007f3eac547279 in ObjectMonitor::EnterI ()

#3 0x00007f3eac546e42 in ObjectMonitor::enter ()

#4 0x00007f3eac62e1eb in ObjectSynchronizer::slow_enter ()

#5 0x00007f3eac62e0e4 in ObjectSynchronizer::fast_enter ()

#6 0x00007f3eac31dbf8 in InterpreterRuntime::monitorenter ()

#7 0x00007f3ea7929b98 in ?? ()

#8 0x000000041261f958 in ?? ()

#9 0x00007f3ea7929b64 in ?? ()

#10 0x0000000000000003 in ?? ()

#11 0x0000000411fff290 in ?? ()

#12 0x0000000053d37980 in ?? ()

#13 0x000000040c9ac640 in ?? ()

#14 0x0000000053d379e0 in ?? ()

#15 0x000000040c9aca08 in ?? ()

#16 0x000000040d1a1698 in ?? ()

#17 0x000000040c9ac650 in ?? ()

#18 0x0000000000000000 in ?? ()

前七级堆栈似乎是jvm中同步器的c代码,这里是问题,我怎么能得到 详细的java堆栈而不是“??”,应该是java符号talbe还是什么?

1 个答案:

答案 0 :(得分:0)

您的调试器将需要JVM本身的调试符号。我不认为Oracle会为他们的Java发行提供它们,但它通常不是OpenJDK的问题。 OpenJDK是Oracle Java的基础,因此使用它不是未知的重大飞跃。

你的堆栈跟踪看起来像gdb,所以我不知道你是不是想在Linux系统上工作。在这种情况下,请检查您的发行版的软件包数据库中的OpenJDK和一个调试符号包 - 大多数(当然所有主流发行版)都有它。

例如,Debian(和Debian派生的发行版,如Ubuntu和Mint)包openjdk-8-dbgopenjdk-7-dbg. Red Hat / Fedora称它们为java-1.8.0-openjdk-debuginfo。我不知道您正在使用哪个发行版,但是如果您在包数据库中搜索" openjdk"和"调试",你可能会找到它。