comparison agent/src/os/bsd/MacosxDebuggerLocal.m @ 17788:f2294a37e723

8034034: [parfait] JNI exc. pending in hotspot/agent/src/os/bsd/MacosxDebuggerLocal.m Summary: added JNI exception check in the appropriate places Reviewed-by: sla, zgu
author ccheung
date Thu, 20 Mar 2014 14:25:22 -0700
parents e4614b063fe1
children 0e1aa319e805
comparison
equal deleted inserted replaced
17787:8c6165f9ea8e 17788:f2294a37e723
93 #define CHECK_EXCEPTION_CLEAR if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); } 93 #define CHECK_EXCEPTION_CLEAR if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); }
94 #define CHECK_EXCEPTION_CLEAR_VOID if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return; } 94 #define CHECK_EXCEPTION_CLEAR_VOID if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return; }
95 #define CHECK_EXCEPTION_CLEAR_(value) if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return value; } 95 #define CHECK_EXCEPTION_CLEAR_(value) if ((*env)->ExceptionOccurred(env)) { (*env)->ExceptionClear(env); return value; }
96 96
97 static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) { 97 static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) {
98 (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg); 98 jclass exceptionClass = (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException");
99 CHECK_EXCEPTION;
100 (*env)->ThrowNew(env, exceptionClass, errMsg);
99 } 101 }
100 102
101 static struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) { 103 static struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) {
102 jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID); 104 jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID);
103 return (struct ps_prochandle*)(intptr_t)ptr; 105 return (struct ps_prochandle*)(intptr_t)ptr;
127 * Signature: ()V 129 * Signature: ()V
128 */ 130 */
129 JNIEXPORT void JNICALL 131 JNIEXPORT void JNICALL
130 Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0(JNIEnv *env, jclass cls) { 132 Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0(JNIEnv *env, jclass cls) {
131 symbolicatorID = (*env)->GetFieldID(env, cls, "symbolicator", "J"); 133 symbolicatorID = (*env)->GetFieldID(env, cls, "symbolicator", "J");
134 CHECK_EXCEPTION;
132 taskID = (*env)->GetFieldID(env, cls, "task", "J"); 135 taskID = (*env)->GetFieldID(env, cls, "task", "J");
133 CHECK_EXCEPTION; 136 CHECK_EXCEPTION;
134 137
135 // for core file 138 // for core file
136 p_ps_prochandle_ID = (*env)->GetFieldID(env, cls, "p_ps_prochandle", "J"); 139 p_ps_prochandle_ID = (*env)->GetFieldID(env, cls, "p_ps_prochandle", "J");
234 */ 237 */
235 JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0 238 JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0
236 (JNIEnv *env, jobject this_obj, jlong addr) { 239 (JNIEnv *env, jobject this_obj, jlong addr) {
237 uintptr_t offset; 240 uintptr_t offset;
238 const char* sym = NULL; 241 const char* sym = NULL;
242 jstring sym_string;
239 243
240 struct ps_prochandle* ph = get_proc_handle(env, this_obj); 244 struct ps_prochandle* ph = get_proc_handle(env, this_obj);
241 if (ph != NULL && ph->core != NULL) { 245 if (ph != NULL && ph->core != NULL) {
242 sym = symbol_for_pc(ph, (uintptr_t) addr, &offset); 246 sym = symbol_for_pc(ph, (uintptr_t) addr, &offset);
243 if (sym == NULL) return 0; 247 if (sym == NULL) return 0;
248 sym_string = (*env)->NewStringUTF(env, sym);
249 CHECK_EXCEPTION_(0);
244 return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID, 250 return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID,
245 (*env)->NewStringUTF(env, sym), (jlong)offset); 251 sym_string, (jlong)offset);
246 } 252 }
247 return 0; 253 return 0;
248 } 254 }
249 255
250 /** called from Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0 */ 256 /** called from Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0 */
747 for (i = 0; i < n; i++) { 753 for (i = 0; i < n; i++) {
748 uintptr_t base; 754 uintptr_t base;
749 const char* name; 755 const char* name;
750 jobject loadObject; 756 jobject loadObject;
751 jobject loadObjectList; 757 jobject loadObjectList;
758 jstring nameString;
752 759
753 base = get_lib_base(ph, i); 760 base = get_lib_base(ph, i);
754 name = get_lib_name(ph, i); 761 name = get_lib_name(ph, i);
762 nameString = (*env)->NewStringUTF(env, name);
763 CHECK_EXCEPTION;
755 loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID, 764 loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID,
756 (*env)->NewStringUTF(env, name), (jlong)0, (jlong)base); 765 nameString, (jlong)0, (jlong)base);
757 CHECK_EXCEPTION; 766 CHECK_EXCEPTION;
758 loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID); 767 loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID);
759 CHECK_EXCEPTION; 768 CHECK_EXCEPTION;
760 (*env)->CallBooleanMethod(env, loadObjectList, listAdd_ID, loadObject); 769 (*env)->CallBooleanMethod(env, loadObjectList, listAdd_ID, loadObject);
761 CHECK_EXCEPTION; 770 CHECK_EXCEPTION;