From: Jian Li <jl...@su...> - 2008-05-01 22:07:21
|
Hello, When I tried to hook a object using BufferedOutputStream to ExitMonitor in VM_Callback, it raise a NullPointerException from java.lang.ThreadLocalMap. (A full exception and source code attached) There is also a similar exception described in http://jira.codehaus.org/browse/RVM-342, although it is in different situation. This problem seems to happen after System.exit called, because a similar code, which writes a chunk of data in VM.sysExit through BufferedOutputStream, executed successfully without any exception. However, if the program was terminated through System.exit(), NullPointerException will thrown from ThreadLocalMap.get(). The root for this problem seems ThreadLocalMap constructor would allocates memory for field "private Entry[] entries". Do you know there is anything that would cause the constructor ThreadLocalMap would not complete successfully? Or is it something to do with System.exit()? Do you know there is a way that I can still use BufferedOutputStream during VM shutting down? Many thanks! Cheers, Jian ------------------------------------ Exception from the code: Exception in thread "MainThread": java.lang.NullPointerException at java.lang.ThreadLocalMap.get(ThreadLocalMap.java:212) at java.lang.ThreadLocal.get(ThreadLocal.java:146) at gnu.java.nio.VMChannel$LocalByteArray.get(VMChannel.java:183) at gnu.java.nio.VMChannel.write(VMChannel.java:397) at gnu.java.nio.VMChannel.write(VMChannel.java:409) at gnu.java.nio.VMChannel.write(VMChannel.java:421) at gnu.java.nio.FileChannelImpl.write(FileChannelImpl.java:261) at java.io.FileOutputStream.write(FileOutputStream.java:283) at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:109) at java.io.BufferedOutputStream.write(BufferedOutputStream.java:152) at java.io.DataOutputStream.write(DataOutputStream.java:115) at ExitCallback.notifyExit(Test.java:27) at org.jikesrvm.VM_Callbacks.notifyExit(VM_Callbacks.java:801) at org.jikesrvm.VM.sysExit(VM.java:2108) at java.lang.VMRuntime.exit(VMRuntime.java:97) at java.lang.Runtime.halt(Runtime.java:399) at java.lang.Runtime.exit(Runtime.java:174) at java.lang.System.exit(System.java:577) We got an uncaught exception while (recursively) handling 1 uncaught exception. Exception in thread "MainThread": java.lang.NullPointerException at java.lang.Thread.die(Thread.java:1066) at java.lang.JikesRVMSupport.threadDied(JikesRVMSupport.java:101) at org.jikesrvm.scheduler.VM_Thread.terminate(VM_Thread.java:675) at org.jikesrvm.scheduler.VM_Thread.handleUncaughtException(VM_Thread.java:1837) at org.jikesrvm.runtime.VM_Runtime.deliverException(VM_Runtime.java:966) at org.jikesrvm.runtime.VM_Runtime.athrow(VM_Runtime.java:620) at org.jikesrvm.VM_Callbacks.notifyExit(VM_Callbacks.java:803) at org.jikesrvm.VM.sysExit(VM.java:2108) at java.lang.VMRuntime.exit(VMRuntime.java:97) at java.lang.Runtime.halt(Runtime.java:399) at java.lang.Runtime.exit(Runtime.java:174) at java.lang.System.exit(System.java:577) JikesRVM: internal error: recursive use of hardware exception registers (exiting) -- Stack -- at [0x712f5928] Ljava/lang/JikesRVMSupport; threadDied(Ljava/lang/Thread;)V at line 101 at [0x712f5950] Lorg/jikesrvm/scheduler/VM_Thread; terminate()V at line 675 at [0x712f5970] Lorg/jikesrvm/scheduler/VM_Thread; handleUncaughtException(Ljava/lang/Throwable;)V at line 1837 at [0x712f59b8] Lorg/jikesrvm/runtime/VM_Runtime; deliverException(Ljava/lang/Throwable;Lorg/jikesrvm/ArchitectureSpecific$VM_Registers;)V at line 966 at [0x712f59f8] Lorg/jikesrvm/runtime/VM_Runtime; deliverHardwareException(II)V at line 746 at [0x712f5a0c] <hardware trap> at [0x71328e18] Ljava/lang/Thread; die()V at line 1066 at [0x71328e34] Ljava/lang/JikesRVMSupport; threadDied(Ljava/lang/Thread;)V at line 101 at [0x71328e5c] Lorg/jikesrvm/scheduler/VM_Thread; terminate()V at line 675 at [0x71328e7c] Lorg/jikesrvm/scheduler/VM_Thread; handleUncaughtException(Ljava/lang/Throwable;)V at line 1837 at [0x71328ec4] Lorg/jikesrvm/runtime/VM_Runtime; deliverException(Ljava/lang/Throwable;Lorg/jikesrvm/ArchitectureSpecific$VM_Registers;)V at line 966 at [0x71328ee8] Lorg/jikesrvm/runtime/VM_Runtime; athrow(Ljava/lang/Throwable;)V at line 620 at [0x71328f10] Lorg/jikesrvm/VM_Callbacks; notifyExit(I)V at line 803 at [0x71328f2c] Lorg/jikesrvm/VM; sysExit(I)V at line 2108 at [0x71328f48] Ljava/lang/VMRuntime; exit(I)V at line 97 at [0x71328f6c] Ljava/lang/Runtime; halt(I)V at line 399 at [0x71328f98] Ljava/lang/Runtime; exit(I)V at line 174 at [0x71328fb8] Ljava/lang/System; exit(I)V at line 577 at [0x71328fe0] Lorg/jikesrvm/scheduler/VM_Thread; terminate()V at line 749 at [0x71329000] Lorg/jikesrvm/scheduler/VM_Thread; startoff()V at line 616 Proc 1: Thread 11: VM.sysExit(): We're in an (unambiguously) recursive call to VM.sysExit(), 2 deep ---------------------------------------------------------------- Code produced the exceptions: import java.io.IOException; import java.io.DataOutputStream; import java.io.FileOutputStream; import java.io.BufferedOutputStream; import org.jikesrvm.VM; import org.jikesrvm.VM_Callbacks; import org.jikesrvm.VM_Callbacks.ExitMonitor; public class Test extends Action { public static void main(String[] args) { VM_Callbacks.addExitMonitor(new ExitCallback()); // VM.sysExit(0); } } class ExitCallback implements ExitMonitor { public void notifyExit(int n) { System.out.println("VM Exiting."); try { FileOutputStream fos = new FileOutputStream("test.tmp"); BufferedOutputStream bos = new BufferedOutputStream(fos); DataOutputStream dos = new DataOutputStream(bos); for (int i = 0; i < 4000; i++) dos.write(0xF00D); dos.close(); bos.close(); fos.close(); } catch (IOException e) { e.printStackTrace(); } } } |