This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

valgrinding GCJ Java code


I have a mixed Java/C app that I am trying to run valgrind (http://valgrind.kde.org) on. The object of this exercise is to find a difficult-to-reproduce crash that is related to JNI and garbage collection. Most of the C code is valgrind clean, it is when it is used from JNI that I am having problems.

It is obvious to me that valgrind will not be able to run a standard JVM, so I started looking into GCJ. GCJ will generate standard object code that I should be able to run valgrind on. But I am stuck at the starting gate.

Valgrind hangs when I try to initialize the GCJ Java runtime. It hangs with both of the alternatives that GCJ provides, namely JvCreateJavaVM() and JNI_CreateJavaVM(), although I suspect that one is just a wrapper around the other.

Debian testing/unstable
Linux rota 2.6.3-1-686 #2 Tue Feb 24 20:24:38 EST 2004 i686 GNU/Linux
ii  valgrind       2.1.1-3        A memory debugger for x86-linux
ii  gcj-3.4        3.4.0-1        The GNU compiler for Java(TM)
ii  gcc-3.4        3.4.0-1        The GNU C compiler

I have two easy test cases that follow. Both generated executables that run, but when run under valgrind, they hang (using 100% cpu) when initializing the Java runtime.

/* vg_cni.cc
 * compile with:
 *   gcc-3.4 vg_cni.cc -o vg_cni -lgcj
 */

#include <gcj/cni.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  jint cni_error;

  /* Initialize the Java runtime. */
  printf("%s:%i\n", __FILE__, __LINE__);
  cni_error = JvCreateJavaVM(NULL);
  if (cni_error < 0) {
    printf(
      "ERROR: Unable to initialize the Java runtime, (%i)\n",
      (int) cni_error
    );
    return(EXIT_FAILURE);
  }

  printf("%s:%i\n", __FILE__, __LINE__);
  JvAttachCurrentThread(NULL, NULL);

  printf("%s:%i\n", __FILE__, __LINE__);
  JvDetachCurrentThread();

  printf("%s:%i\n", __FILE__, __LINE__);
  argc = argc;
  argv = argv;
  return(EXIT_SUCCESS);
}


/* vg_jni.c * compile with: * gcc-3.4 vg_jni.c -o vg_jni -lgcj */

#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
  JavaVMInitArgs vm_args;
  JNIEnv *env = NULL;
  JavaVM *jvm = NULL;
  jint jni_error;

  /* Setup the vm_args structure. */
  memset(&vm_args, 0, sizeof(vm_args));
  vm_args.version = JNI_VERSION_1_2;

  /* Create the Java Virtual Machine. */
  printf("%s:%i\n", __FILE__, __LINE__);
  jni_error = JNI_CreateJavaVM(&jvm, (void **) &env, &vm_args);
  if (jni_error < 0) {
    printf(
      "ERROR: Unable to create Java Virtual Machine, (%i)\n",
      (int) jni_error
    );
    return(EXIT_FAILURE);
  }

  printf("%s:%i\n", __FILE__, __LINE__);
  if ((*env)->ExceptionOccurred(env)) {
    printf("exception occurred %s:%i\n", __FILE__, __LINE__);
  }

  printf("%s:%i\n", __FILE__, __LINE__);
  (*jvm)->DestroyJavaVM(jvm);

  printf("%s:%i\n", __FILE__, __LINE__);
  argc = argc;
  argv = argv;
  return(EXIT_SUCCESS);
}


$ valgrind vg_cni
==5831== Memcheck, a memory error detector for x86-linux.
==5831== Copyright (C) 2002-2004, and GNU GPL'd, by Julian Seward.
==5831== Using valgrind-2.1.1, a program supervision framework for x86-linux.
==5831== Copyright (C) 2000-2004, and GNU GPL'd, by Julian Seward.
==5831== For more details, rerun with: -v
==5831==
vg_cni.cc:14
==5831== Syscall param sigaction(act) contains uninitialised or unaddressable byte(s)
==5831== at 0x3CA36025: __libc_sigaction (in /lib/tls/libc-2.3.2.so)
==5831== Address 0x4FFFE830 is on thread 1's stack
==5831==
==5831== Syscall param sigaction(act) contains uninitialised or unaddressable byte(s)
==5831== at 0x3CA36025: __libc_sigaction (in /lib/tls/libc-2.3.2.so)
==5831== by 0x7FFFFFFB: ???
==5831== Address 0x4FFFE780 is on thread 1's stack
==5831==
==5831== Conditional jump or move depends on uninitialised value(s)
==5831== at 0x3C646535: GC_push_all_eager (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C6478C9: GC_push_current_stack (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C64E12D: GC_generic_push_regs (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C6479FD: GC_push_roots (in /usr/lib/libgcj.so.5.0.0)
==5831==
==5831== Conditional jump or move depends on uninitialised value(s)
==5831== at 0x3C64653A: GC_push_all_eager (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C6478C9: GC_push_current_stack (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C64E12D: GC_generic_push_regs (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C6479FD: GC_push_roots (in /usr/lib/libgcj.so.5.0.0)
==5831==
==5831== Conditional jump or move depends on uninitialised value(s)
==5831== at 0x3C646535: GC_push_all_eager (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C6465B9: GC_push_all_stack (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C64DB96: GC_push_all_stacks (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C649815: GC_default_push_other_roots (in /usr/lib/libgcj.so.5.0.0)
==5831==
==5831== Syscall param sigaction(act) contains uninitialised or unaddressable byte(s)
==5831== at 0x3CAE551D: syscall (in /lib/tls/libc-2.3.2.so)
==5831== by 0x8048736: JvCreateJavaVM(void*) (in /home/tom/tmp/valgrind_gcj/vg_cni)
==5831== by 0x8048670: main (in /home/tom/tmp/valgrind_gcj/vg_cni)
==5831== Address 0x4FFFE9B0 is on thread 1's stack
==5831==
==5831== Conditional jump or move depends on uninitialised value(s)
==5831== at 0x3C64D25C: GC_pthread_create (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C472162: _Jv_ThreadStart(java::lang::Thread*, _Jv_Thread_t*, void (*)(java::lang::Thread*)) (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C49E6A6: java::lang::Thread::start() (in /usr/lib/libgcj.so.5.0.0)
==5831== by 0x3C473E09: _Jv_CreateJavaVM(void*) (in /usr/lib/libgcj.so.5.0.0)==5831==
==5831== Thread 2:
==5831== Conditional jump or move depends on uninitialised value(s)
==5831== at 0x3CB4CFF1: thread_wrapper (vg_libpthread.c:824)
==5831== by 0xB800FACC: do__quit (vg_scheduler.c:1792)
==5831==
==5831== Thread 2:
==5831== thread_wrapper: invalid attr->__detachstate
==5831== at 0x3CB4C00F: pthread_error (vg_libpthread.c:355)
==5831== by 0x3CB4D000: thread_wrapper (vg_libpthread.c:826)
==5831== by 0xB800FACC: do__quit (vg_scheduler.c:1792)
==5831==
==5831== Thread 2:
==5831== Conditional jump or move depends on uninitialised value(s)
==5831== at 0x3CB4D004: thread_wrapper (vg_libpthread.c:827)
==5831== by 0xB800FACC: do__quit (vg_scheduler.c:1792)
------------------------hangs here-----------------------------


--
Tom Schutter (mailto:tom@platte.com)
Platte River Associates, Inc. (http://www.platte.com)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]