Generating a Java Core Dump

This post demonstrates how you can generate a Java core dump manually (using JNI).

1. Create a Java class

/**
 * A class to demonstrate core dumping.
 */
public class CoreDumper {
 
  // load the library
  static {
    System.loadLibrary("nativelib");
  }
 
  // native method declaration
  public native void core();
 
  public static void main(String[] args) {
    new CoreDumper().core();
  }
}

2. Compile the Java class

$ javac CoreDumper.java
$ ls
CoreDumper.class  CoreDumper.java

3. Generate the header file

$ javah -jni CoreDumper
$ ls
CoreDumper.class  CoreDumper.h  CoreDumper.java

4. Implement the native method
Copy the method declaration from the header file and create a new file called CoreDumper.c containing the implementation of this method:

#include "CoreDumper.h"
 
void bar() {
  // the following statements will produce a core
  int* p = NULL;
  *p = 5;
 
  // alternatively:
  // abort();
}
 
void foo() {
  bar();
}
 
JNIEXPORT void JNICALL Java_CoreDumper_core
  (JNIEnv *env, jobject obj) {
  foo();
}

5. Compile the native code
This command may vary based on your operating system. On my Red Hat Linux machine, I use the following command:

$ gcc -fPIC -o libnativelib.so -shared \
            -I$JAVA_HOME/include/linux/ \
            -I$JAVA_HOME/include/ \
             CoreDumper.c
$ ls
CoreDumper.class  CoreDumper.h  CoreDumper.java libnativelib.so

6. Run the program

$ java -Djava.library.path=. CoreDumper
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x0000002b1cecf75c, pid=18919, tid=1076017504
#
# JRE version: 6.0_21-b06
# Java VM: Java HotSpot(TM) 64-Bit Server VM (17.0-b16 mixed mode linux-amd64 )
# Problematic frame:
# C  [libnativelib.so+0x75c]  bar+0x10
#
# An error report file with more information is saved as:
# /home/sharfah/tmp/jni/hs_err_pid18919.log
#
# If you would like to submit a bug report, please visit:
#   http://java.sun.com/webapps/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#
Aborted (core dumped)

The core file
As shown above, running the program causes it to crash and a core file is produced. On my machine, the operating system writes out core files to /var/tmp/cores. You can use the following command to see what your core file directory is configured to:

$ cat /proc/sys/kernel/core_pattern
/var/tmp/cores/%e.%p.%u.core
$ ls /var/tmp/cores
java.21178.146385.core

In my next post, I will show you how can you perform some quick analysis on a core file to see what caused the crash.

from http://fahdshariff.blogspot.co.uk/2012/08/generating-java-core-dump.html

posted @ 2014-09-17 11:10  princessd8251  阅读(296)  评论(0)    收藏  举报