jni调用崩溃的情况下如何在linux上查找失败的原因?
Posted
技术标签:
【中文标题】jni调用崩溃的情况下如何在linux上查找失败的原因?【英文标题】:how to find the reason of failure on linux in case of jni call crash? 【发布时间】:2012-05-12 16:27:33 【问题描述】:在 linux 上运行涉及 JNI 调用的 Java 应用程序时,我注意到很少有类似下面的痕迹,看起来像崩溃。
但应用程序继续并成功。
“Java 运行时环境检测到致命错误:调用了纯虚拟方法”
上面的trace是什么意思?是什么导致了这次失败?我没有得到任何核心转储。 即使有时我得到 coredump,每次的故障堆栈都是不同的。在这些调用中看起来没有任何问题。
有什么建议吗?
【问题讨论】:
【参考方案1】:如果您没有任何纯虚函数,或者您确定有纯虚函数的类是纯抽象的,则该错误通常表示堆问题,例如尝试调用已删除对象的方法。现在使用 JNI,我会怀疑 GC 问题。尝试使用内存调试器运行代码以追踪潜在问题。
【讨论】:
【参考方案2】:根据我的经验:在启动新的 Java 之前,请确保您已经杀死了以前的 Java。并确保该过程已终止(在我的情况下,这需要一点时间)。只有这样,启动一个新的。
您可能还想为此添加 C/C++ 标记,因为这更多来自 C 端而不是 Java 端。您可能会得到更多/更好的答案。就我而言,这带有 GC 警告,但我尚未对此进行调查。
好书:
-
http://c2.com/cgi/wiki?PureVirtualFunctionCalled
http://tombarta.wordpress.com/2008/07/10/gcc-pure-virtual-method-called/
来自这些地方的两句话,我知道有些人希望他们的答案都集中在一个地方。
C2 维基:
顺便说一下,原因是子虚拟可以访问实例 可能尚未构建或已经构建的成员 被摧毁。因此,您不能调用子虚拟。
Tombarta 的博客:
为什么会这样?因为我在对象仍在使用时将其删除。
【讨论】:
以上是关于jni调用崩溃的情况下如何在linux上查找失败的原因?的主要内容,如果未能解决你的问题,请参考以下文章
JNI AttachNativeThread在Linux上始终失败,返回值为-1
linux Jni调用so文件建了测试WebProject 写了一个servlet执行调用 一启动tomcat jvm崩溃了 错误日志如下