Re: SableVM on ARM fails to run HelloWorld
Chris Develder <[email protected]> Mon, 28 Nov 2005 20:34:45 +0100
| Newsgroups | gmane.comp.java.vm.sablevm.general |
|---|---|
| Message-ID | <[email protected]> |
The class loader _is_ looking in the current directory (as I said, this was obvious from strace'ing). The difference between putting the file in the sablevm-classpath and some other working dir is indeed that in the latter case, the class loading is initiated by java.lang.ClassLoader.loadClass rather than the bootstrap class loader directly. By debugging I noticed that in sablevm-classpath-1.12/java/net/URLClassLoader.java, the FileResource that is created at the beginning of URLClassLoader.findClass returns a resource.getLength() == 0. Which I think is not what to expect (this length == 0 results in the failure of _svmh_parse_class_file (in sablevm-1.12/src/libsablevm/class_file_parser.c). Adding System.out.println statements, I found that File.length() does not produce the same result when called upon multiple times. I ended up trying to verify VMFile.length(), but printf() statements in sablevm-classpath-1.12/native/jni/java-io/java_io_VMFile.c resulted in segfaults... - Chris Etienne Gagnon wrote: > Hi Chris, > > OK, so this confirms that the problem is class-library related. The > internal bootstrap class loader seems to be working fine. This can > greatly simplify your search for the bug. > > For one thing, it seems that the System class loader is either: > 1- not working at all, or > 2- not looking in the current directory. > > I suspect that "1-" is the case, here. By putting the file in > <install-dir>/share/sablevm-classpath, the class was probably loaded by > the bootstrap class loader (i.e. sablevm's internal class loader). > > You should start your investigation at > ClassLoader.defaultGetSystemClassLoader() in sablevm-classpath. > > As this happens out of the bootstrap cycle, you can probably add > "System.out.println()" statements to track down execution without > hitting chicken-egg bootstrap problems. In last resort, SableVM > provides java.lang package-specific VirualMachine.println() statements > which require no bootstrap support. > > Have fun! > > Etienne > > > > Chris Develder wrote: > >>I found that copying the HelloWorld.class file to >><install-dir>/share/sablevm-classpath (alongside the jars) makes >>'sablevm HelloWorld' work. >> >>This lead me to believe that the current working directory was not >>checked when looking for HelloWorld.class. Yet, without the .class file >>in <install-dir>/share/sablevm-classpath, I did find (using strace) that >>the file in the pwd was looked for and opened... But then the >>java.lang.ClassFormatError occurs. >> >>Apparently files in the classpath and pwd are not treated in the same way? >> >> >>>Can you check what happens when mmap() is used to read the class file >>>insrc/libsablevm/class_loader.c (or src/libsablevm/zip_file_reader.c). >> >>As for mmap: I added printfs before all mmap calls, but they were never >>reached. I did notice failing open() calls using strace, where attempts >>are made to acces files that are actually in the jars in the classpath. >>(Making/installing sablevm-classpath uncompressed makes the open() calls >>work) I guess that it is normal that in case of sablevm-classpath with >>compressed classfiles _svmf_bootcl_internal_load_ondisk_class_file is >>called and fails (for the .class files are in the jar)? > > > > ------------------------------------------------------------------------ > > _______________________________________________ > SableVM-user mailing list > [email protected] > http://sablevm.org/lists/control/listinfo/sablevm-user