static void JNICALL cbEarlyVMDeath(jvmtiEnv *jvmti_env, JNIEnv *env) { LOG_CB(("cbEarlyVMDeath")); if ( gdata->vmDead ) { EXIT_ERROR(AGENT_ERROR_INTERNAL,"VM died more than once"); } disposeEnvironment(jvmti_env); gdata->jvmti = NULL; gdata->jvm = NULL; gdata->vmDead = JNI_TRUE; LOG_MISC(("END cbEarlyVMDeath")); }
/* All normal exit doors lead here */ void debugInit_exit(jvmtiError error, const char *msg) { enum exit_codes { EXIT_NO_ERRORS = 0, EXIT_JVMTI_ERROR = 1, EXIT_TRANSPORT_ERROR = 2 }; // Prepare to exit. Log error and finish logging LOG_MISC(("Exiting with error %s(%d): %s", jvmtiErrorText(error), error, ((msg == NULL) ? "" : msg))); // coredump requested by command line. Keep JVMTI data dirty if (error != JVMTI_ERROR_NONE && docoredump) { LOG_MISC(("Dumping core as requested by command line")); finish_logging(); abort(); } finish_logging(); // Cleanup the JVMTI if we have one if (gdata != NULL) { gdata->vmDead = JNI_TRUE; if (gdata->jvmti != NULL) { // Dispose of jvmti (gdata->jvmti becomes NULL) disposeEnvironment(gdata->jvmti); } } // We are here with no errors. Kill entire process and exit with zero exit code if (error == JVMTI_ERROR_NONE) { forceExit(EXIT_NO_ERRORS); return; } // No transport initilized. // As we don't have any details here exiting with separate exit code if (error == AGENT_ERROR_TRANSPORT_INIT) { forceExit(EXIT_TRANSPORT_ERROR); return; } // We have JVMTI error. Call hotspot jni_FatalError handler jniFatalError(NULL, msg, error, EXIT_JVMTI_ERROR); // hotspot calls os:abort() so we should never reach code below, // but guard against possible hotspot changes // Last chance to die, this kills the entire process. forceExit(EXIT_JVMTI_ERROR); }
/* All normal exit doors lead here */ void debugInit_exit(jvmtiError error, const char *msg) { int exit_code = 0; /* Pick an error code */ if ( error != JVMTI_ERROR_NONE ) { exit_code = 1; if ( docoredump ) { finish_logging(exit_code); abort(); } } if ( msg==NULL ) { msg = ""; } LOG_MISC(("Exiting with error %s(%d): %s", jvmtiErrorText(error), error, msg)); gdata->vmDead = JNI_TRUE; /* Let's try and cleanup the JVMTI, if we even have one */ if ( gdata->jvmti != NULL ) { /* Dispose of jvmti (gdata->jvmti becomes NULL) */ disposeEnvironment(gdata->jvmti); } /* Finish up logging. We reach here if JDWP is doing the exiting. */ finish_logging(exit_code); /* Only first call matters */ /* Let's give the JNI a FatalError if non-exit 0, which is historic way */ if ( exit_code != 0 ) { JNIEnv *env = NULL; jniFatalError(env, msg, error, exit_code); } /* Last chance to die, this kills the entire process. */ forceExit(exit_code); }