--- old/agent/src/os/solaris/proc/libproc.h 2018-09-24 06:36:22.781656441 -0700 +++ new/agent/src/os/solaris/proc/libproc.h 2018-09-24 06:36:22.690647774 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -420,22 +420,14 @@ /* * Stack frame iteration interface. */ -#ifdef SOLARIS_11_B159_OR_LATER -/* building on Nevada-B159 or later so define the new callback */ typedef int proc_stack_f( void *, /* the cookie given to Pstack_iter() */ const prgregset_t, /* the frame's registers */ uint_t, /* argc for the frame's function */ - const long *, /* argv for the frame's function */ - int, /* bitwise flags describing the frame (see below) */ - int); /* a signal number */ + const long *); /* argv for the frame's function */ #define PR_SIGNAL_FRAME 1 /* called by a signal handler */ #define PR_FOUND_SIGNAL 2 /* we found the corresponding signal number */ -#else -/* building on Nevada-B158 or earlier so define the old callback */ -typedef int proc_stack_f(void *, const prgregset_t, uint_t, const long *); -#endif extern int Pstack_iter(struct ps_prochandle *, const prgregset_t, proc_stack_f *, void *); --- old/agent/src/os/solaris/proc/salibproc.h 2018-09-24 06:36:23.203696634 -0700 +++ new/agent/src/os/solaris/proc/salibproc.h 2018-09-24 06:36:23.123689015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 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 @@ -46,6 +46,17 @@ extern "C" { #endif +/* extended symbol table information */ +typedef struct { + const char *prs_object; /* object name */ + const char *prs_name; /* symbol name */ + Lmid_t prs_lmid; /* link map id */ + uint_t prs_id; /* symbol id */ + uint_t prs_table; /* symbol table id */ +} prsyminfo_t; + +typedef struct ps_prochandle ps_prochandle_t; + /* * 'object_name' is the name of a load object obtained from an * iteration over the process's address space mappings (Pmapping_iter), @@ -53,9 +64,10 @@ * or else it is one of the special PR_OBJ_* values above. */ -extern int Plookup_by_addr(struct ps_prochandle *, - uintptr_t, char *, size_t, GElf_Sym *); - +extern int Plookup_by_addr(ps_prochandle_t *, uintptr_t, char *, + size_t, GElf_Sym *, prsyminfo_t *); +extern ps_prochandle_t *proc_arg_grab(const char *, int, int, + int *, const char **); typedef int proc_map_f(void *, const prmap_t *, const char *); extern int Pobject_iter(struct ps_prochandle *, proc_map_f *, void *); @@ -88,7 +100,6 @@ #define G_ELF 13 /* Libelf error, elf_errno() is meaningful */ #define G_NOTE 14 /* Required PT_NOTE Phdr not present in core */ -extern struct ps_prochandle *proc_arg_grab(const char *, int, int, int *); extern const pstatus_t *Pstatus(struct ps_prochandle *); /* Flags accepted by Prelease (partial) */ @@ -101,22 +112,14 @@ /* * Stack frame iteration interface. */ -#ifdef SOLARIS_11_B159_OR_LATER -/* building on Nevada-B159 or later so define the new callback */ typedef int proc_stack_f( void *, /* the cookie given to Pstack_iter() */ const prgregset_t, /* the frame's registers */ uint_t, /* argc for the frame's function */ - const long *, /* argv for the frame's function */ - int, /* bitwise flags describing the frame (see below) */ - int); /* a signal number */ + const long *); /* argv for the frame's function */ #define PR_SIGNAL_FRAME 1 /* called by a signal handler */ #define PR_FOUND_SIGNAL 2 /* we found the corresponding signal number */ -#else -/* building on Nevada-B158 or earlier so define the old callback */ -typedef int proc_stack_f(void *, const prgregset_t, uint_t, const long *); -#endif extern int Pstack_iter(struct ps_prochandle *, const prgregset_t, proc_stack_f *, void *); --- old/agent/src/os/solaris/proc/saproc.cpp 2018-09-24 06:36:23.572731779 -0700 +++ new/agent/src/os/solaris/proc/saproc.cpp 2018-09-24 06:36:23.465721588 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -24,9 +24,6 @@ #include "salibproc.h" #include "sun_jvm_hotspot_debugger_proc_ProcDebuggerLocal.h" -#ifndef SOLARIS_11_B159_OR_LATER -#include -#endif #include #include #include @@ -45,20 +42,6 @@ // 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) { @@ -467,7 +450,6 @@ 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; @@ -490,14 +472,6 @@ 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!! @@ -755,7 +729,8 @@ #endif // connect to process/core - struct ps_prochandle* ph = proc_arg_grab(cmdLine_cstr, (isProcess? PR_ARG_PIDS : PR_ARG_CORES), PGRAB_FORCE, &gcode); + 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*)) { @@ -994,11 +969,6 @@ 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 @@ -1027,23 +997,8 @@ 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 + fill_cframe_list, &dbgo2); return dbgo2.obj; } @@ -1233,7 +1188,7 @@ 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); + nameBuf, sizeof(nameBuf), &sym, NULL); if (res != 0) { // failed return 0; } @@ -1264,102 +1219,6 @@ 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 @@ -1379,14 +1238,6 @@ 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; --- old/make/solaris/makefiles/saproc.make 2018-09-24 06:36:23.905763496 -0700 +++ new/make/solaris/makefiles/saproc.make 2018-09-24 06:36:23.819755305 -0700 @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 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 @@ -62,34 +62,6 @@ SA_LFLAGS += -mt -xnolib -norunpath endif -# The libproc Pstack_iter() interface changed in Nevada-B159. -# Use 'uname -r -v' to determine the Solaris version as per -# Solaris Nevada team request. This logic needs to match: -# agent/src/os/solaris/proc/saproc.cpp: set_has_newer_Pstack_iter(): -# - skip SunOS 4 or older -# - skip Solaris 10 or older -# - skip two digit internal Nevada builds -# - skip three digit internal Nevada builds thru 149 -# - skip internal Nevada builds 150-158 -# - if not skipped, print define for Nevada-B159 or later -SOLARIS_11_B159_OR_LATER := \ -$(shell uname -r -v \ - | sed -n \ - -e '/^[0-4]\. /b' \ - -e '/^5\.[0-9] /b' \ - -e '/^5\.10 /b' \ - -e '/ snv_[0-9][0-9]$$/b' \ - -e '/ snv_[01][0-4][0-9]$$/b' \ - -e '/ snv_15[0-8]$$/b' \ - -e 's/.*/-DSOLARIS_11_B159_OR_LATER/' \ - -e 'p' \ - ) - -# Uncomment the following to simulate building on Nevada-B159 or later -# when actually building on Nevada-B158 or earlier: -#SOLARIS_11_B159_OR_LATER=-DSOLARIS_11_B159_OR_LATER - - $(LIBSAPROC): $(SASRCFILES) $(SADISOBJ) $(SAMAPFILE) $(QUIETLY) if [ "$(BOOT_JAVA_HOME)" = "" ]; then \ echo "ALT_BOOTDIR, BOOTDIR or JAVA_HOME needs to be defined to build SA"; \ @@ -102,7 +74,6 @@ -I$(GENERATED) \ -I$(BOOT_JAVA_HOME)/include \ -I$(BOOT_JAVA_HOME)/include/$(Platform_os_family) \ - $(SOLARIS_11_B159_OR_LATER) \ $(SASRCFILES) \ $(SADISOBJ) \ $(SA_LFLAGS) \ @@ -116,7 +87,6 @@ -I$(GENERATED) \ -I$(BOOT_JAVA_HOME)/include \ -I$(BOOT_JAVA_HOME)/include/$(Platform_os_family) \ - $(SOLARIS_11_B159_OR_LATER) \ $(SADISSRCFILES) \ -c -o $(SADISOBJ)