tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Daniel Diaz <Daniel.D...@inria.fr>
Subject signals with JNI
Date Tue, 06 Feb 2001 20:05:38 GMT
Hi,

I have a problem under Linux loading the JVM since before I set a Handler to 
catch SIGSEGV signals. It seems that this causes some troubles when the JVM 
is loaded. This seems due to threads in Java. I saw several post from 
yourself about this topic.

I include my C test file (called x.c) and the command-line 
to compile it is:

gcc -o x /usr/java/jdk1.3/jre/lib/i386/client/libjvm.so x.c 
-I/usr/java/jdk1.3/include -I/usr/java/jdk1.3/include/linux -g -Wall

(assuming the JDK is installed in /usr/java/jdk1.3)

Here is the C file

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

JNIEnv *env;
JavaVM *vm;
jclass cls;

void
Load_JVM(void)
{
  JavaVMOption options[2];
  JavaVMInitArgs vm_args;

  options[0].optionString = "-Djava.class.path=."; /* user classes */

  vm_args.version = JNI_VERSION_1_2;
  vm_args.options = options;
  vm_args.nOptions = 1;
  vm_args.ignoreUnrecognized = 1;
    
  printf("READY TO LOAD THE JVM\n");
  if (JNI_CreateJavaVM(&vm, (void **)&env, (void *)&vm_args) < 0)
    {
      fprintf(stderr, "cannot load the JVM\n");
      exit(1);
    }

  printf("JVM LOADED\n");
}


void
SIGSEGV_Handler(void)

{
 fprintf(stderr, "Received SIGSEGV\n");
 exit(2);
}


int
main(int argc, char *argv[])
{
  signal(SIGSEGV, (void (*)()) SIGSEGV_Handler);
  Load_JVM();
  return 0;
}

It simply installs a handler for SIGSEGV and then loads the JVM. If you 
comment the line signal(SIGSEGV, (void (*)()) SIGSEGV_Handler) in the main(), 
this works properly but with the handler this crashes with:

READY TO LOAD THE JVM
#
# HotSpot Virtual Machine Error, Internal Error
# Please report this error at
# http://java.sun.com/cgi-bin/bugreport.cgi
#
# Error ID: 4F533F4C494E55580E4350500570
#
# Problematic Thread: Received SIGSEGV

Another strange problem occurs if you replace this line by
  system("uname -a");

after executing system() the JVM loading is blocked (in a sigsuspend I think).

Could you help me on this please ?

-- 
===============================================
                 Daniel Diaz
University of Paris 1      INRIA Rocquencourt
75013 Paris FRANCE      78153 Le Chesnay FRANCE
        web: http://pauillac.inria.fr/~diaz
        email: Daniel.Diaz@inria.fr
===============================================



Mime
View raw message