gcj program crashes, with small example

Fabian Sturm sturmf@informatik.tu-muenchen.de
Fri Feb 20 03:00:00 GMT 2004


hi!
I already posted this mail to the gcc-help mailing list but I guess this 
one would have been the more appropriate. So I hope someone on this list 
might have a clue what I am doing wrong.
The problem is running vCreateJavaVM(NULL);
It seems it can't be run inside a thread?? In my example it runs inside 
an omniOrb thread but as far as I could see this is only a wrapper around
pthread. 
I now produced a very small example showing the crash.
The backtrace was:
[Switching to Thread 16386 (LWP 18107)]
0x40559247 in GC_push_all_eager () from /usr/lib/libgcj.so.4
(gdb) bt
#0 0x40559247 in GC_push_all_eager () from /usr/lib/libgcj.so.4
#1 0x405592c2 in GC_push_all_stack () from /usr/lib/libgcj.so.4
#2 0x40555776 in GC_push_all_stacks () from /usr/lib/libgcj.so.4
#3 0x4055bfd7 in GC_default_push_other_roots () from /usr/lib/libgcj.so.4
#4 0x4055a4a2 in GC_push_roots () from /usr/lib/libgcj.so.4
#5 0x40558056 in GC_mark_some () from /usr/lib/libgcj.so.4
#6 0x4054fbbe in GC_stopped_mark () from /usr/lib/libgcj.so.4
#7 0x4054f8b5 in GC_try_to_collect_inner () from /usr/lib/libgcj.so.4
#8 0x4055ad6d in GC_init_inner () from /usr/lib/libgcj.so.4
#9 0x4055aa0e in GC_init () from /usr/lib/libgcj.so.4
#10 0x40553ae9 in GC_init_gcj_malloc () from /usr/lib/libgcj.so.4
#11 0x4054d1e5 in _Jv_InitGC() () from /usr/lib/libgcj.so.4
#12 0x40361baa in _Jv_CreateJavaVM(void*) () from /usr/lib/libgcj.so.4
#13 0x08048df3 in JvCreateJavaVM (vm_args=0x0) at cni.h:125
#14 0x08048bf9 in testclass::testThread() (this=0x8049c98) at crashme.cpp:38
#15 0x08048bd5 in testclass::testThreadStartRoutine(void*) (data=0x8049c98) at crashme.cpp:27
#16 0x40037cca in omni_thread_wrapper () from /usr/lib/libomnithread.so.3
#17 0x408dcf60 in pthread_start_thread () from /lib/i686/libpthread.so.0
#18 0x408dd0fe in pthread_start_thread_event () from /lib/i686/libpthread.so.0
#19 0x40a17327 in clone () from /lib/i686/libc.so.6
The used software was:
 gcc (GCC) 3.3.1 (SuSE Linux)
 libomnithread.so.3 from omniORB-4.0.2-3
Hope this helps to finally find the problem!
Thanks Fabian
-------------- next part --------------
#include <omnithread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <gcj/cni.h>
#include <java/lang/Throwable.h>
class testclass {
	public:	
		testclass();
		void run();
		static void * testThreadStartRoutine(void *data);
		void testThread();
};
testclass::testclass() {
}
void * testclass::testThreadStartRoutine(void * data)
{
	std::cout << "thread started" << std::endl;
	testclass * tc=(testclass*) data;
	tc->testThread();
	return 0;
}
void testclass::testThread() {
	try
 	{
 	//java VM already initialized?
 	static bool javaVM = false;
 	if (!javaVM)
 	{
 		JvCreateJavaVM(NULL);
 		javaVM = true;
 	}
 	// attach current thread to java. should have no sideeffects if already attached
 	JvAttachCurrentThread(NULL, NULL);
 	// create space-manager, this would be the call to create a method creating a java object
 	// m_jLayoutArea = SpaceManagerUtils::toRectangle2i(m_layoutArea);
 	}
 	catch (java::lang::Throwable *t)
 	{
 	throw t;
 	}
	while (1) {
		std::cout << "in thread"<< std::endl;
	}
}
void testclass::run() {
	(new omni_thread(&testThreadStartRoutine, this))->start();
}
int main(int argc, char **argv)
{
	testclass *t = new testclass();
/*****
 * Here is the error, if done like this it crashes
 * if you remove t->run() and replace it with t->testThread() it starts to work!
 */
	t->run();
	//t->testThread();
	while (1) {
		sleep(10);
	}
}
-------------- next part --------------
LIBS = -L/usr/lib -lomnithread
all: crashme
crashme: crashme.o $(EXTERNAL_OBJECTS) 
	gcj $(LIBS) -o $@ $^
%.o: %.cpp
	g++ $(INCLUDES) -c -g -o $(OBJDIR)$@ $^
clean: 
	rm crashme crashme.o


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /