如何在JVM GCTaskThread中调试SIGSEGV问题

4

我的应用在生产环境中遇到崩溃问题。崩溃转储指示在GCTaskThread中发生了SIGSEGV。

它使用JNI,因此可能存在一些内存损坏的源,尽管我不能确定。

我该如何调试这个问题 - 我想尝试-XX:OnError...,但我不确定这会帮助我调试。

另外,您们中的一些人能否给出一个具体的示例,介绍JNI代码如何导致GC发生SIGSEGV崩溃。

编辑

操作系统:SUSE Linux Enterprise Server 10(x86_64)

vm_info:Java HotSpot(TM) 64-Bit Server VM (11.0-b15) for linux-amd64 JRE (1.6.0_10-b33),由“java_re”使用gcc 3.2.2(SuSE Linux)于2008年9月26日01:10:29构建

编辑

在我们禁用超线程后,该问题停止发生,有没有什么想法?

3个回答

2

JNI 代码中的错误可能以多种方式出现:

The program crashes during execution of a native method (most common).
The program crashes some time after returning from the native method, often during GC (not so common).
Bad JNI code causes deadlocks shortly after returning from a native method (occasional).

如果您认为用户编写的本地代码与JVM之间存在交互问题(即JNI问题),则可以运行诊断工具来帮助您检查JNI转换。要调用这些诊断工具,请在启动JVM时指定-Xcheck:jni选项。
-Xcheck:jni选项激活了一组包装器函数,围绕JNI函数进行检查。包装器函数对传入参数执行检查。这些检查包括:
Whether the call and the call that initialized JNI are on the same thread.
Whether the object parameters are valid objects.
Whether local or global references refer to valid objects.
Whether the type of a field matches the Get<Type>Field or Set<Type>Field call.
Whether static and nonstatic field IDs are valid.
Whether strings are valid and non-null.
Whether array elements are non-null.
The types on array elements.

请阅读以下链接: http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/html/jni_debug.html http://www.oracle.com/technetwork/java/javase/clopts-139448.html#gbmtq

谢谢,问题在于这种情况很少发生在生产环境中,而且这个标志不适合这种情况。当我在测试环境中使用它时,我没有遇到任何错误,还是谢谢和+1。 - ekeren
请问您的操作系统、Java版本和供应商是什么? - Nike
已添加到原帖,谢谢。 - ekeren
JNI检查没有帮助,我将开始悬赏。 - ekeren
如果您遇到堆栈转储,则通常可以找到可能有问题的JNI代码。以下是如何执行此操作的帖子:http://wig-wag.com/devblog/?p=51 但如果这是由JVM引起的,那么这种方法就不适用了... - EdH

1
使用valgrind。这听起来像是内存损坏。输出将会很详细,但尽可能将报告隔离到JNI库中。

1
感谢您的回答。我无法在我的开发环境中重现它,也不能承担在生产服务器上运行valgrind的费用。 - ekeren
1
valgrind会捕获内存覆盖问题,它可能在开发环境中是无害的(例如您没有看到与覆盖相关的问题),但在生产环境中会导致问题。将其在开发中运行-这就是它的用途。 - abdollar

0

由于故障线程似乎是GCTaskThread,您是否尝试启用verbose:gc并分析输出(最好使用samurai等图形工具)?在检查hs_err文件后,您能否隔离特定的lib?

此外,请提供有关问题原因以及是否容易重现的更多信息。


不可复现,当我在机器上禁用超线程后就停止发生了。你认为我通过verbose:gc输出会看到什么? - ekeren
你可能能够看到是哪个阶段或场景触发了特定问题,然后缩小范围找出与这些任务相关的本地库。 - Musannif Zahir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接