valgrind and CNI

David Blasby dblasby@gmail.com
Mon Feb 14 17:30:00 GMT 2005


I wrote a C++ wrapper (using CNI) around a Java library, and a "C"
program that calls the C++ wrapper.  It appears to work fine, but when
I try to valgrind it, valgrind complains a bit then hangs (at 100%)
cpu.

I simplified my program so that I have a simple C++ program that calls
the Java library (using CNI).  When I valgrind, I find that it does
the same thing - spits out a few errors then hangs.

Is this a known problem or is there something wrong with my program?

[dblasby@localhost ~/jts_compile]$ valgrind --tool=memcheck a.out
==3571== Memcheck, a memory error detector for x86-linux.
==3571== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward et al.
==3571== Using valgrind-2.2.0, a program supervision framework for x86-linux.
==3571== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward et al.
==3571== For more details, rerun with: -v
==3571==
==3571== Conditional jump or move depends on uninitialised value(s)
==3571==    at 0x6C6E916: GC_push_all_eager (in /usr/lib/libgcj.so.5.0.0)
==3571==    by 0x6C6FD0B: GC_push_current_stack (in /usr/lib/libgcj.so.5.0.0)
==3571==    by 0x6C75F86: GC_generic_push_regs (in /usr/lib/libgcj.so.5.0.0)
==3571==    by 0x6C6FE17: GC_push_roots (in /usr/lib/libgcj.so.5.0.0)
==3571==
==3571== Conditional jump or move depends on uninitialised value(s)
==3571==    at 0x6C6E916: GC_push_all_eager (in /usr/lib/libgcj.so.5.0.0)
==3571==    by 0x6C6E975: GC_push_all_stack (in /usr/lib/libgcj.so.5.0.0)
==3571==    by 0x6C75A32: GC_push_all_stacks (in /usr/lib/libgcj.so.5.0.0)
==3571==    by 0x6C71B0B: GC_default_push_other_roots (in
/usr/lib/libgcj.so.5.0.0)
==3571==
==3571== Syscall param sigaction(act) contains uninitialised or
unaddressable byte(s)
==3571==    at 0x735A77: syscall (in /lib/tls/libc-2.3.3.so)
==3571==  Address 0x52BFE730 is on thread 1's stack
==3571== Conditional jump or move depends on uninitialised value(s)
==3571==    at 0x6C751ED: GC_pthread_create (in /usr/lib/libgcj.so.5.0.0)
==3571==    by 0x6AAEB55: _Jv_ThreadStart(java::lang::Thread*,
_Jv_Thread_t*, void (*)(java::lang::Thread*)) (in
/usr/lib/libgcj.so.5.0.0)
==3571==    by 0x6ADA438: java::lang::Thread::start() (in
/usr/lib/libgcj.so.5.0.0)
==3571==    by 0x6AB0858: _Jv_CreateJavaVM(void*) (in /usr/lib/libgcj.so.5.0.0)
==3571==
==3571== Thread 2:
==3571== Conditional jump or move depends on uninitialised value(s)
==3571==    at 0x1BA5C765: thread_wrapper (vg_libpthread.c:836)
==3571==    by 0xB000F14F: do__quit (vg_scheduler.c:1872)
==3571==
==3571== Thread 2:
==3571== thread_wrapper: invalid attr->__detachstate
==3571==    at 0x1BA5B8A0: pthread_error (vg_libpthread.c:380)
==3571==    by 0x1BA5C772: thread_wrapper (vg_libpthread.c:838)
==3571==    by 0xB000F14F: do__quit (vg_scheduler.c:1872)
==3571==
==3571== Thread 2:
==3571== Conditional jump or move depends on uninitialised value(s)
==3571==    at 0x1BA5C779: thread_wrapper (vg_libpthread.c:839)
==3571==    by 0xB000F14F: do__quit (vg_scheduler.c:1872)

(hangs)

Here's the C++ program:

#pragma GCC java_exceptions

#include "Geometry.h"
#include "StaticGeometry.h"
#include <java/lang/Integer.h>
#include <java/lang/Math.h>
#include <gcj/cni.h>
#include <stdio.h>
#include <java/lang/System.h>
#include <java/lang/String.h>
#include <java/io/PrintStream.h>
#include <java/lang/Throwable.h>

int main(int argc, char** argv)
{
  //  using namespace java::lang::String;
    using namespace java::lang;
    using namespace com::vividsolutions::jts::geom;
    using namespace test;
   


	 JvCreateJavaVM(NULL);
         JvAttachCurrentThread(NULL, NULL);	

	JvInitClass(&java::lang::System::class$);
        JvInitClass(&Geometry::class$);
        JvInitClass(&StaticGeometry::class$);
	JvInitClass(&System::class$);
        JvInitClass(&String::class$);


	char *wkt1 = "LINESTRING(-10 -10,20 20)";
   
        jstring wkt_j  = JvNewStringLatin1 (wkt1);
printf("about to call java function geomFromWKT\n");
	Geometry *g1   =StaticGeometry::geomFromWKT(wkt_j);
printf("about to call java function getLength\n");
        jdouble len1   = StaticGeometry::getLength(g1);

        printf("len1 = %g\n", (double) len1);
}
// gcjh Geometry
//
// gcj -g -shared -o libjts.so jts-1.5.jar
// gcj -classpath jts-1.5.jar -shared -o libstaticgeom.so StaticGeometry.class

//g++ -g t.cc -lgcj -ljts -lstaticgeom -L.
// /sbin/ldconfig ~dblasby/helloworld/

Thanks,

dave



More information about the Java mailing list