< 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 >