< prev index next >

agent/src/os/solaris/proc/saproc.cpp

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 22,34 **** * */ #include "salibproc.h" #include "sun_jvm_hotspot_debugger_proc_ProcDebuggerLocal.h" - #ifndef SOLARIS_11_B159_OR_LATER - #include <sys/utsname.h> - #endif #include <thread_db.h> #include <strings.h> #include <limits.h> #include <demangle.h> #include <stdarg.h> --- 22,31 ----
*** 43,66 **** #define SYMBOL_BUF_SIZE 256 #define ERR_MSG_SIZE (PATH_MAX + 256) // debug modes static int _libsaproc_debug = 0; - #ifndef SOLARIS_11_B159_OR_LATER - static bool _Pstack_iter_debug = false; - - static void dprintf_2(const char* format,...) { - if (_Pstack_iter_debug) { - va_list alist; - - va_start(alist, format); - fputs("Pstack_iter DEBUG: ", stderr); - vfprintf(stderr, format, alist); - va_end(alist); - } - } - #endif // !SOLARIS_11_B159_OR_LATER static void print_debug(const char* format,...) { if (_libsaproc_debug) { va_list alist; --- 40,49 ----
*** 465,475 **** } return 0; } - // Pstack_iter() proc_stack_f callback prior to Nevada-B159 static int fill_cframe_list(void *cd, const prgregset_t regs, uint_t argc, const long *argv) { DebuggerWith2Objects* dbgo2 = (DebuggerWith2Objects*) cd; JNIEnv* env = dbgo2->env; jobject this_obj = dbgo2->this_obj; --- 448,457 ----
*** 488,505 **** dbgo2->obj = dbgo2->obj2; } return 0; } - // Pstack_iter() proc_stack_f callback in Nevada-B159 or later - /*ARGSUSED*/ - static int - wrapper_fill_cframe_list(void *cd, const prgregset_t regs, uint_t argc, - const long *argv, int frame_flags, int sig) { - return(fill_cframe_list(cd, regs, argc, argv)); - } - // part of the class sharing workaround // FIXME: !!HACK ALERT!! // The format of sharing achive file header is needed to read shared heap --- 470,479 ----
*** 753,763 **** // all other conditions are handled by libproc.so. } #endif // connect to process/core ! struct ps_prochandle* ph = proc_arg_grab(cmdLine_cstr, (isProcess? PR_ARG_PIDS : PR_ARG_CORES), PGRAB_FORCE, &gcode); env->ReleaseStringUTFChars(cmdLine, cmdLine_cstr); if (! ph) { if (gcode > 0 && gcode < sizeof(proc_arg_grab_errmsgs)/sizeof(const char*)) { char errMsg[ERR_MSG_SIZE]; sprintf(errMsg, "Attach failed : %s", proc_arg_grab_errmsgs[gcode]); --- 727,738 ---- // all other conditions are handled by libproc.so. } #endif // connect to process/core ! ps_prochandle_t* ph = proc_arg_grab(cmdLine_cstr, (isProcess? PR_ARG_PIDS : PR_ARG_CORES), PGRAB_FORCE, &gcode, NULL); ! env->ReleaseStringUTFChars(cmdLine, cmdLine_cstr); if (! ph) { if (gcode > 0 && gcode < sizeof(proc_arg_grab_errmsgs)/sizeof(const char*)) { char errMsg[ERR_MSG_SIZE]; sprintf(errMsg, "Attach failed : %s", proc_arg_grab_errmsgs[gcode]);
*** 992,1006 **** p_td_ta_thr_iter(p_td_thragent_t, fill_thread_list, &dbgo, TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY, TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS); } - #ifndef SOLARIS_11_B159_OR_LATER - // building on Nevada-B158 or earlier so more hoops to jump through - static bool has_newer_Pstack_iter = false; // older version by default - #endif - /* * Class: sun_jvm_hotspot_debugger_proc_ProcDebuggerLocal * Method: fillCFrameList0 * Signature: ([J)Lsun/jvm/hotspot/debugger/proc/ProcCFrame; * Description: fills CFrame list for a given thread --- 967,976 ----
*** 1025,1051 **** } env->ReleaseLongArrayElements(regsArray, ptr, JNI_ABORT); CHECK_EXCEPTION_(0); - #ifdef SOLARIS_11_B159_OR_LATER - // building on Nevada-B159 or later so use the new callback - Pstack_iter((struct ps_prochandle*) p_ps_prochandle, gregs, - wrapper_fill_cframe_list, &dbgo2); - #else - // building on Nevada-B158 or earlier so figure out which callback to use - - if (has_newer_Pstack_iter) { - // Since we're building on Nevada-B158 or earlier, we have to - // cast wrapper_fill_cframe_list to make the compiler happy. - Pstack_iter((struct ps_prochandle*) p_ps_prochandle, gregs, - (proc_stack_f *)wrapper_fill_cframe_list, &dbgo2); - } else { Pstack_iter((struct ps_prochandle*) p_ps_prochandle, gregs, fill_cframe_list, &dbgo2); - } - #endif // SOLARIS_11_B159_OR_LATER return dbgo2.obj; } /* * Class: sun_jvm_hotspot_debugger_proc_ProcDebuggerLocal --- 995,1006 ----
*** 1231,1241 **** p_ps_prochandle = env->GetLongField(this_obj, p_ps_prochandle_ID); char nameBuf[SYMBOL_BUF_SIZE + 1]; GElf_Sym sym; int res = Plookup_by_addr((struct ps_prochandle*) p_ps_prochandle, (uintptr_t) address, ! nameBuf, sizeof(nameBuf), &sym); if (res != 0) { // failed return 0; } jstring resSym = env->NewStringUTF(nameBuf); --- 1186,1196 ---- p_ps_prochandle = env->GetLongField(this_obj, p_ps_prochandle_ID); char nameBuf[SYMBOL_BUF_SIZE + 1]; GElf_Sym sym; int res = Plookup_by_addr((struct ps_prochandle*) p_ps_prochandle, (uintptr_t) address, ! nameBuf, sizeof(nameBuf), &sym, NULL); if (res != 0) { // failed return 0; } jstring resSym = env->NewStringUTF(nameBuf);
*** 1262,1367 **** } env->ReleaseStringUTFChars(name, ptr); return res; } - #ifndef SOLARIS_11_B159_OR_LATER - // Determine if the OS we're running on has the newer version - // of libproc's Pstack_iter. - // - // Set env var PSTACK_ITER_DEBUG=true to debug this logic. - // Set env var PSTACK_ITER_DEBUG_RELEASE to simulate a 'release' value. - // Set env var PSTACK_ITER_DEBUG_VERSION to simulate a 'version' value. - // - // frankenputer 'uname -r -v': 5.10 Generic_141445-09 - // jurassic 'uname -r -v': 5.11 snv_164 - // lonepeak 'uname -r -v': 5.11 snv_127 - // - static void set_has_newer_Pstack_iter(JNIEnv *env) { - static bool done_set = false; - - if (done_set) { - // already set has_newer_Pstack_iter - return; - } - - struct utsname name; - if (uname(&name) == -1) { - THROW_NEW_DEBUGGER_EXCEPTION("uname() failed!"); - } - dprintf_2("release='%s' version='%s'\n", name.release, name.version); - - if (_Pstack_iter_debug) { - char *override = getenv("PSTACK_ITER_DEBUG_RELEASE"); - if (override != NULL) { - strncpy(name.release, override, SYS_NMLN - 1); - name.release[SYS_NMLN - 2] = '\0'; - dprintf_2("overriding with release='%s'\n", name.release); - } - override = getenv("PSTACK_ITER_DEBUG_VERSION"); - if (override != NULL) { - strncpy(name.version, override, SYS_NMLN - 1); - name.version[SYS_NMLN - 2] = '\0'; - dprintf_2("overriding with version='%s'\n", name.version); - } - } - - // the major number corresponds to the old SunOS major number - int major = atoi(name.release); - if (major >= 6) { - dprintf_2("release is SunOS 6 or later\n"); - has_newer_Pstack_iter = true; - done_set = true; - return; - } - if (major < 5) { - dprintf_2("release is SunOS 4 or earlier\n"); - done_set = true; - return; - } - - // some SunOS 5.* build so now check for Solaris versions - char *dot = strchr(name.release, '.'); - int minor = 0; - if (dot != NULL) { - // release is major.minor format - *dot = NULL; - minor = atoi(dot + 1); - } - - if (minor <= 10) { - dprintf_2("release is Solaris 10 or earlier\n"); - done_set = true; - return; - } else if (minor >= 12) { - dprintf_2("release is Solaris 12 or later\n"); - has_newer_Pstack_iter = true; - done_set = true; - return; - } - - // some Solaris 11 build so now check for internal build numbers - if (strncmp(name.version, "snv_", 4) != 0) { - dprintf_2("release is Solaris 11 post-GA or later\n"); - has_newer_Pstack_iter = true; - done_set = true; - return; - } - - // version begins with "snv_" so a pre-GA build of Solaris 11 - int build = atoi(&name.version[4]); - if (build >= 159) { - dprintf_2("release is Nevada-B159 or later\n"); - has_newer_Pstack_iter = true; - } else { - dprintf_2("release is Nevada-B158 or earlier\n"); - } - - done_set = true; - } - #endif // !SOLARIS_11_B159_OR_LATER - /* * Class: sun_jvm_hotspot_debugger_proc_ProcDebuggerLocal * Method: initIDs * Signature: ()V * Description: get JNI ids for fields and methods of ProcDebuggerLocal class --- 1217,1226 ----
*** 1377,1394 **** void* libproc_handle = dlopen("libproc.so", RTLD_LAZY | RTLD_GLOBAL); if (libproc_handle == 0) THROW_NEW_DEBUGGER_EXCEPTION("can't load libproc.so, if you are using Solaris 5.7 or below, copy libproc.so from 5.8!"); - #ifndef SOLARIS_11_B159_OR_LATER - _Pstack_iter_debug = getenv("PSTACK_ITER_DEBUG") != NULL; - - set_has_newer_Pstack_iter(env); - CHECK_EXCEPTION; - dprintf_2("has_newer_Pstack_iter=%d\n", has_newer_Pstack_iter); - #endif - p_ps_prochandle_ID = env->GetFieldID(clazz, "p_ps_prochandle", "J"); CHECK_EXCEPTION; libthread_db_handle_ID = env->GetFieldID(clazz, "libthread_db_handle", "J"); CHECK_EXCEPTION; --- 1236,1245 ----
< prev index next >