< prev index next >
src/jdk.hotspot.agent/macosx/native/libsaproc/MacosxDebuggerLocal.m
Print this page
rev 54099 : 8257988: Remove JNF dependency from libsaproc/MacosxDebuggerLocal.m
Reviewed-by: yan
*** 22,33 ****
*
*/
#include <objc/objc-runtime.h>
#import <Foundation/Foundation.h>
- #import <JavaNativeFoundation/JavaNativeFoundation.h>
- #import <JavaRuntimeSupport/JavaRuntimeSupport.h>
#include <jni.h>
#import <mach/mach.h>
#import <mach/mach_types.h>
--- 22,31 ----
*** 258,267 ****
--- 256,298 ----
}
(*env)->ReleaseStringUTFChars(env, symbolName, symbolName_cstr);
return addr;
}
+ /* Create a pool and initiate a try block to catch any exception */
+ #define JNI_COCOA_ENTER(env) \
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; \
+ @try {
+
+ /* Don't allow NSExceptions to escape to Java.
+ * If there is a Java exception that has been thrown that should escape.
+ * And ensure we drain the auto-release pool.
+ */
+ #define JNI_COCOA_EXIT(env) \
+ } \
+ @catch (NSException *e) { \
+ NSLog(@"%@", [e callStackSymbols]); \
+ } \
+ @finally { \
+ [pool drain]; \
+ };
+
+ static NSString* JavaStringToNSString(JNIEnv *env, jstring jstr) {
+
+ if (jstr == NULL) {
+ return NULL;
+ }
+ jsize len = (*env)->GetStringLength(env, jstr);
+ const jchar *chars = (*env)->GetStringChars(env, jstr, NULL);
+ if (chars == NULL) {
+ return NULL;
+ }
+ NSString *result = [NSString stringWithCharacters:(UniChar *)chars length:len];
+ (*env)->ReleaseStringChars(env, jstr, chars);
+ return result;
+ }
+
/*
* Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal
* Method: lookupByName0
* Signature: (Ljava/lang/String;Ljava/lang/String;)J
*/
*** 275,297 ****
return lookupByNameIncore(env, ph, this_obj, objectName, symbolName);
}
jlong address = 0;
! JNF_COCOA_ENTER(env);
! NSString *symbolNameString = JNFJavaToNSString(env, symbolName);
print_debug("lookupInProcess called for %s\n", [symbolNameString UTF8String]);
id symbolicator = getSymbolicator(env, this_obj);
if (symbolicator != nil) {
uint64_t (*dynamicCall)(id, SEL, NSString *) = (uint64_t (*)(id, SEL, NSString *))&objc_msgSend;
address = (jlong) dynamicCall(symbolicator, @selector(addressForSymbol:), symbolNameString);
}
print_debug("address of symbol %s = %llx\n", [symbolNameString UTF8String], address);
! JNF_COCOA_EXIT(env);
return address;
}
/*
--- 306,329 ----
return lookupByNameIncore(env, ph, this_obj, objectName, symbolName);
}
jlong address = 0;
! JNI_COCOA_ENTER(env);
!
! NSString *symbolNameString = JavaStringToNSString(env, symbolName);
print_debug("lookupInProcess called for %s\n", [symbolNameString UTF8String]);
id symbolicator = getSymbolicator(env, this_obj);
if (symbolicator != nil) {
uint64_t (*dynamicCall)(id, SEL, NSString *) = (uint64_t (*)(id, SEL, NSString *))&objc_msgSend;
address = (jlong) dynamicCall(symbolicator, @selector(addressForSymbol:), symbolNameString);
}
print_debug("address of symbol %s = %llx\n", [symbolNameString UTF8String], address);
! JNI_COCOA_EXIT(env);
return address;
}
/*
*** 803,813 ****
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I(
JNIEnv *env, jobject this_obj, jint jpid)
{
print_debug("attach0 called for jpid=%d\n", (int)jpid);
! JNF_COCOA_ENTER(env);
kern_return_t result;
task_t gTask = 0;
result = task_for_pid(mach_task_self(), jpid, &gTask);
--- 835,845 ----
Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I(
JNIEnv *env, jobject this_obj, jint jpid)
{
print_debug("attach0 called for jpid=%d\n", (int)jpid);
! JNI_COCOA_ENTER(env);
kern_return_t result;
task_t gTask = 0;
result = task_for_pid(mach_task_self(), jpid, &gTask);
*** 917,927 ****
mach_port_deallocate(mach_task_self(), gTask);
mach_port_deallocate(mach_task_self(), tgt_exception_port);
THROW_NEW_DEBUGGER_EXCEPTION("Can't attach symbolicator to the process");
}
! JNF_COCOA_EXIT(env);
}
/** For core file,
called from Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2 */
static void fillLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) {
--- 949,959 ----
mach_port_deallocate(mach_task_self(), gTask);
mach_port_deallocate(mach_task_self(), tgt_exception_port);
THROW_NEW_DEBUGGER_EXCEPTION("Can't attach symbolicator to the process");
}
! JNI_COCOA_EXIT(env);
}
/** For core file,
called from Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2 */
static void fillLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) {
*** 1011,1021 ****
struct ps_prochandle* ph = get_proc_handle(env, this_obj);
if (ph != NULL && ph->core != NULL) {
Prelease(ph);
return;
}
! JNF_COCOA_ENTER(env);
task_t gTask = getTask(env, this_obj);
kern_return_t k_res = 0;
// Restore the pre-saved original exception ports registered with the target process
--- 1043,1054 ----
struct ps_prochandle* ph = get_proc_handle(env, this_obj);
if (ph != NULL && ph->core != NULL) {
Prelease(ph);
return;
}
!
! JNI_COCOA_ENTER(env);
task_t gTask = getTask(env, this_obj);
kern_return_t k_res = 0;
// Restore the pre-saved original exception ports registered with the target process
*** 1062,1068 ****
detach_cleanup(gTask, env, this_obj, true);
}
detach_cleanup(gTask, env, this_obj, false);
! JNF_COCOA_EXIT(env);
}
--- 1095,1101 ----
detach_cleanup(gTask, env, this_obj, true);
}
detach_cleanup(gTask, env, this_obj, false);
! JNI_COCOA_EXIT(env);
}
< prev index next >