/**
* 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.java3. Generate the header file
$ javah -jni CoreDumper $ ls CoreDumper.class CoreDumper.h CoreDumper.java4. 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 codeThis 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.coreIn my next post, I will show you how can you perform some quick analysis on a core file to see what caused the crash. Next Post:
Analysing a Java Core Dump
No comments:
Post a Comment
Note: Only a member of this blog may post a comment.