# HG changeset patch # User ihse # Date 1521633276 -3600 # Node ID 9f3ce373370af9134dec2f770f9e3327c0b794c0 # Parent af8ab4f90a324ec97f399265a6559ae385ee14d5 8199682: Clean up building the saproc library Reviewed-by: erikj, dholmes, sundar diff -r af8ab4f90a32 -r 9f3ce373370a make/lib/Lib-jdk.hotspot.agent.gmk --- a/make/lib/Lib-jdk.hotspot.agent.gmk Wed Mar 21 10:13:49 2018 +0100 +++ b/make/lib/Lib-jdk.hotspot.agent.gmk Wed Mar 21 12:54:36 2018 +0100 @@ -29,17 +29,15 @@ ################################################################################ -ifneq ($(findstring $(OPENJDK_TARGET_OS), macosx windows), ) - DISABLE_MAPFILES := true -endif - SA_TOPDIR := $(TOPDIR)/src/jdk.hotspot.agent -# Defaults for most platforms -SA_TOOLCHAIN := TOOLCHAIN_DEFAULT -SA_NAME := saproc -SA_SRC += $(SA_TOPDIR)/share/native/libsaproc $(SA_TOPDIR)/$(OPENJDK_TARGET_OS)/native/libsaproc +SA_SRC += \ + $(SA_TOPDIR)/share/native/libsaproc \ + $(SA_TOPDIR)/$(OPENJDK_TARGET_OS)/native/libsaproc \ + # + SA_MAPFILE := $(TOPDIR)/make/mapfiles/libsaproc/mapfile-$(OPENJDK_TARGET_OS) + SA_INCLUDES := \ $(addprefix -I, $(SA_SRC)) \ -I$(SUPPORT_OUTPUTDIR)/headers/jdk.hotspot.agent \ @@ -47,59 +45,40 @@ # ifeq ($(OPENJDK_TARGET_OS), linux) - SA_CFLAGS := $(CFLAGS_JDKLIB) -D_FILE_OFFSET_BITS=64 - ifeq ($(OPENJDK_TARGET_CPU), x86) - SA_LDFLAGS := -march=i586 - endif - - SA_LIBS := -lthread_db $(LIBDL) + SA_CFLAGS := -D_FILE_OFFSET_BITS=64 else ifeq ($(OPENJDK_TARGET_OS), solaris) - SA_TOOLCHAIN := TOOLCHAIN_LINK_CXX - SA_CFLAGS := $(CFLAGS_JDKLIB) - SA_CXXFLAGS := $(CXXFLAGS_JDKLIB) - SA_LDFLAGS := -mt $(LDFLAGS_CXX_JDK) - SA_LIBS := -ldl -ldemangle -lthread -lproc + SA_LDFLAGS := -mt else ifeq ($(OPENJDK_TARGET_OS), macosx) - SA_EXCLUDE_FILES := BsdDebuggerLocal.c ps_proc.c salibelf.c StubDebuggerLocal.c - SA_CFLAGS := $(CFLAGS_JDKLIB) \ - -Damd64 -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \ + SA_CFLAGS := -Damd64 -D_GNU_SOURCE -mno-omit-leaf-frame-pointer \ -mstack-alignment=16 -fPIC - SA_LIBS := -framework Foundation -framework JavaNativeFoundation \ - -framework JavaRuntimeSupport -framework Security -framework CoreFoundation - else ifeq ($(OPENJDK_TARGET_OS), windows) - SA_NAME := sawindbg - COMMON_CFLAGS := -D_WINDOWS -D_DEBUG -D_CONSOLE -D_MBCS -EHsc - SA_CFLAGS := $(subst -DWIN32_LEAN_AND_MEAN,, $(CFLAGS_JDKLIB)) \ - $(COMMON_CFLAGS) - SA_CXXFLAGS := $(subst -DWIN32_LEAN_AND_MEAN,, $(CXXFLAGS_JDKLIB)) \ - $(COMMON_CFLAGS) - SA_LDFLAGS := -manifest - SA_LIBS := dbgeng.lib + SA_CFLAGS := -D_WINDOWS -D_DEBUG -D_CONSOLE -D_MBCS -EHsc ifeq ($(OPENJDK_TARGET_CPU), x86_64) - SA_CXXFLAGS += -DWIN64 + SA_CXXFLAGS := -DWIN64 else - SA_CXXFLAGS += -RTC1 + SA_CXXFLAGS := -RTC1 endif endif ################################################################################ $(eval $(call SetupJdkLibrary, BUILD_LIBSA, \ - NAME := $(SA_NAME), \ - TOOLCHAIN := $(SA_TOOLCHAIN), \ + NAME := saproc, \ OPTIMIZATION := NONE, \ DISABLED_WARNINGS_microsoft := 4267, \ DISABLED_WARNINGS_gcc := sign-compare, \ DISABLED_WARNINGS_CXX_solstudio := truncwarn unknownpragma, \ SRC := $(SA_SRC), \ - EXCLUDE_FILES := test.c saproc_audit.cpp $(SA_EXCLUDE_FILES), \ - CFLAGS := $(SA_INCLUDES) $(SA_CFLAGS) $(SA_CUSTOM_CFLAGS), \ - CXXFLAGS := $(SA_INCLUDES) $(SA_CXXFLAGS) $(SA_CUSTOM_CXXFLAGS), \ + CFLAGS := $(CFLAGS_JDKLIB) $(SA_INCLUDES) $(SA_CFLAGS) $(SA_CUSTOM_CFLAGS), \ + CXXFLAGS := $(CXXFLAGS_JDKLIB) $(SA_INCLUDES) $(SA_CFLAGS) $(SA_CXXFLAGS), \ LDFLAGS := $(LDFLAGS_JDKLIB) $(SA_LDFLAGS), \ - LIBS := $(SA_LIBS), \ + LIBS_linux := -lthread_db $(LIBDL), \ + LIBS_solaris := -ldl -ldemangle -lthread -lproc, \ + LIBS_macosx := -framework Foundation -framework JavaNativeFoundation \ + -framework JavaRuntimeSupport -framework Security -framework CoreFoundation, \ + LIBS_windows := dbgeng.lib, \ MAPFILE := $(SA_MAPFILE), \ )) diff -r af8ab4f90a32 -r 9f3ce373370a src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h --- a/src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h Wed Mar 21 10:13:49 2018 +0100 +++ b/src/jdk.hotspot.agent/linux/native/libsaproc/libproc.h Wed Mar 21 12:54:36 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, 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 @@ -30,10 +30,6 @@ #include #include "proc_service.h" -#ifdef ALT_SASRCDIR -#include "libproc_md.h" -#endif - #include /************************************************************************************ diff -r af8ab4f90a32 -r 9f3ce373370a src/jdk.hotspot.agent/linux/native/libsaproc/test.c --- a/src/jdk.hotspot.agent/linux/native/libsaproc/test.c Wed Mar 21 10:13:49 2018 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2003, 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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include -#include -#include "libproc.h" - -int main(int argc, char** argv) { - struct ps_prochandle* ph; - - init_libproc(true); - switch (argc) { - case 2: { - // process - ph = Pgrab(atoi(argv[1])); - break; - } - - case 3: { - // core - ph = Pgrab_core(argv[1], argv[2]); - break; - } - - default: { - printf("usage %s or %s \n"); - return 1; - } - } - - if (ph) { - Prelease(ph); - return 0; - } else { - printf("can't connect to debuggee\n"); - return 1; - } -} diff -r af8ab4f90a32 -r 9f3ce373370a src/jdk.hotspot.agent/macosx/native/libsaproc/BsdDebuggerLocal.c --- a/src/jdk.hotspot.agent/macosx/native/libsaproc/BsdDebuggerLocal.c Wed Mar 21 10:13:49 2018 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,402 +0,0 @@ -/* - * Copyright (c) 2002, 2017, 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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include -#include -#include "libproc.h" - -#if defined(x86_64) && !defined(amd64) -#define amd64 1 -#endif - -#ifdef i386 -#include "sun_jvm_hotspot_debugger_x86_X86ThreadContext.h" -#endif - -#ifdef amd64 -#include "sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext.h" -#endif - -#if defined(sparc) || defined(sparcv9) -#include "sun_jvm_hotspot_debugger_sparc_SPARCThreadContext.h" -#endif - -static jfieldID p_ps_prochandle_ID = 0; -static jfieldID threadList_ID = 0; -static jfieldID loadObjectList_ID = 0; - -static jmethodID createClosestSymbol_ID = 0; -static jmethodID createLoadObject_ID = 0; -static jmethodID getThreadForThreadId_ID = 0; -static jmethodID listAdd_ID = 0; - -#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; } -#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;} -#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; } -#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;} - -static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) { - (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg); -} - -static struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj) { - jlong ptr = (*env)->GetLongField(env, this_obj, p_ps_prochandle_ID); - return (struct ps_prochandle*)(intptr_t)ptr; -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: init0 - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0 - (JNIEnv *env, jclass cls) { - jclass listClass; - - if (init_libproc(getenv("LIBSAPROC_DEBUG") != NULL) != true) { - THROW_NEW_DEBUGGER_EXCEPTION("can't initialize libproc"); - } - - // fields we use - p_ps_prochandle_ID = (*env)->GetFieldID(env, cls, "p_ps_prochandle", "J"); - CHECK_EXCEPTION; - threadList_ID = (*env)->GetFieldID(env, cls, "threadList", "Ljava/util/List;"); - CHECK_EXCEPTION; - loadObjectList_ID = (*env)->GetFieldID(env, cls, "loadObjectList", "Ljava/util/List;"); - CHECK_EXCEPTION; - - // methods we use - createClosestSymbol_ID = (*env)->GetMethodID(env, cls, "createClosestSymbol", - "(Ljava/lang/String;J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol;"); - CHECK_EXCEPTION; - createLoadObject_ID = (*env)->GetMethodID(env, cls, "createLoadObject", - "(Ljava/lang/String;JJ)Lsun/jvm/hotspot/debugger/cdbg/LoadObject;"); - CHECK_EXCEPTION; - getThreadForThreadId_ID = (*env)->GetMethodID(env, cls, "getThreadForThreadId", - "(J)Lsun/jvm/hotspot/debugger/ThreadProxy;"); - CHECK_EXCEPTION; - // java.util.List method we call - listClass = (*env)->FindClass(env, "java/util/List"); - CHECK_EXCEPTION; - listAdd_ID = (*env)->GetMethodID(env, listClass, "add", "(Ljava/lang/Object;)Z"); - CHECK_EXCEPTION; -} - -JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize - (JNIEnv *env, jclass cls) -{ -#ifdef _LP64 - return 8; -#else - return 4; -#endif - -} - - -static void fillThreadsAndLoadObjects(JNIEnv* env, jobject this_obj, struct ps_prochandle* ph) { - int n = 0, i = 0; - - // add threads - n = get_num_threads(ph); - for (i = 0; i < n; i++) { - jobject thread; - jobject threadList; - lwpid_t lwpid; - - lwpid = get_lwp_id(ph, i); - thread = (*env)->CallObjectMethod(env, this_obj, getThreadForThreadId_ID, - (jlong)lwpid); - CHECK_EXCEPTION; - threadList = (*env)->GetObjectField(env, this_obj, threadList_ID); - CHECK_EXCEPTION; - (*env)->CallBooleanMethod(env, threadList, listAdd_ID, thread); - CHECK_EXCEPTION; - } - - // add load objects - n = get_num_libs(ph); - for (i = 0; i < n; i++) { - uintptr_t base; - const char* name; - jobject loadObject; - jobject loadObjectList; - - base = get_lib_base(ph, i); - name = get_lib_name(ph, i); - loadObject = (*env)->CallObjectMethod(env, this_obj, createLoadObject_ID, - (*env)->NewStringUTF(env, name), (jlong)0, (jlong)base); - CHECK_EXCEPTION; - loadObjectList = (*env)->GetObjectField(env, this_obj, loadObjectList_ID); - CHECK_EXCEPTION; - (*env)->CallBooleanMethod(env, loadObjectList, listAdd_ID, loadObject); - CHECK_EXCEPTION; - } -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: attach0 - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I - (JNIEnv *env, jobject this_obj, jint jpid) { - - struct ps_prochandle* ph; - if ( (ph = Pgrab(jpid)) == NULL) { - THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process"); - } - (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph); - fillThreadsAndLoadObjects(env, this_obj, ph); -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: attach0 - * Signature: (Ljava/lang/String;Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2 - (JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) { - const char *execName_cstr; - const char *coreName_cstr; - jboolean isCopy; - struct ps_prochandle* ph; - - execName_cstr = (*env)->GetStringUTFChars(env, execName, &isCopy); - CHECK_EXCEPTION; - coreName_cstr = (*env)->GetStringUTFChars(env, coreName, &isCopy); - CHECK_EXCEPTION; - - if ( (ph = Pgrab_core(execName_cstr, coreName_cstr)) == NULL) { - (*env)->ReleaseStringUTFChars(env, execName, execName_cstr); - (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr); - THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file"); - } - (*env)->SetLongField(env, this_obj, p_ps_prochandle_ID, (jlong)(intptr_t)ph); - (*env)->ReleaseStringUTFChars(env, execName, execName_cstr); - (*env)->ReleaseStringUTFChars(env, coreName, coreName_cstr); - fillThreadsAndLoadObjects(env, this_obj, ph); -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: detach0 - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0 - (JNIEnv *env, jobject this_obj) { - struct ps_prochandle* ph = get_proc_handle(env, this_obj); - if (ph != NULL) { - Prelease(ph); - } -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: lookupByName0 - * Signature: (Ljava/lang/String;Ljava/lang/String;)J - */ -JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0 - (JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) { - const char *objectName_cstr, *symbolName_cstr; - jlong addr; - jboolean isCopy; - struct ps_prochandle* ph = get_proc_handle(env, this_obj); - - objectName_cstr = NULL; - if (objectName != NULL) { - objectName_cstr = (*env)->GetStringUTFChars(env, objectName, &isCopy); - CHECK_EXCEPTION_(0); - } - symbolName_cstr = (*env)->GetStringUTFChars(env, symbolName, &isCopy); - CHECK_EXCEPTION_(0); - - addr = (jlong) lookup_symbol(ph, objectName_cstr, symbolName_cstr); - - if (objectName_cstr != NULL) { - (*env)->ReleaseStringUTFChars(env, objectName, objectName_cstr); - } - (*env)->ReleaseStringUTFChars(env, symbolName, symbolName_cstr); - return addr; -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: lookupByAddress0 - * Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol; - */ -JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0 - (JNIEnv *env, jobject this_obj, jlong addr) { - uintptr_t offset; - const char* sym = NULL; - - struct ps_prochandle* ph = get_proc_handle(env, this_obj); - sym = symbol_for_pc(ph, (uintptr_t) addr, &offset); - if (sym == NULL) return 0; - return (*env)->CallObjectMethod(env, this_obj, createClosestSymbol_ID, - (*env)->NewStringUTF(env, sym), (jlong)offset); -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: readBytesFromProcess0 - * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult; - */ -JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0 - (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) { - - jboolean isCopy; - jbyteArray array; - jbyte *bufPtr; - ps_err_e err; - - array = (*env)->NewByteArray(env, numBytes); - CHECK_EXCEPTION_(0); - bufPtr = (*env)->GetByteArrayElements(env, array, &isCopy); - CHECK_EXCEPTION_(0); - - err = ps_pread(get_proc_handle(env, this_obj), (psaddr_t) (uintptr_t)addr, bufPtr, numBytes); - (*env)->ReleaseByteArrayElements(env, array, bufPtr, 0); - return (err == PS_OK)? array : 0; -} - -JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0 - (JNIEnv *env, jobject this_obj, jint lwp_id) { - - struct reg gregs; - jboolean isCopy; - jlongArray array; - jlong *regs; - - struct ps_prochandle* ph = get_proc_handle(env, this_obj); - if (get_lwp_regs(ph, lwp_id, &gregs) != true) { - THROW_NEW_DEBUGGER_EXCEPTION_("get_thread_regs failed for a lwp", 0); - } - -#undef NPRGREG -#ifdef i386 -#define NPRGREG sun_jvm_hotspot_debugger_x86_X86ThreadContext_NPRGREG -#endif -#ifdef amd64 -#define NPRGREG sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_NPRGREG -#endif -#if defined(sparc) || defined(sparcv9) -#define NPRGREG sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_NPRGREG -#endif - - array = (*env)->NewLongArray(env, NPRGREG); - CHECK_EXCEPTION_(0); - regs = (*env)->GetLongArrayElements(env, array, &isCopy); - -#undef REG_INDEX - -#ifdef i386 -#define REG_INDEX(reg) sun_jvm_hotspot_debugger_x86_X86ThreadContext_##reg - - regs[REG_INDEX(GS)] = (uintptr_t) gregs.r_gs; - regs[REG_INDEX(FS)] = (uintptr_t) gregs.r_fs; - regs[REG_INDEX(ES)] = (uintptr_t) gregs.r_es; - regs[REG_INDEX(DS)] = (uintptr_t) gregs.r_ds; - regs[REG_INDEX(EDI)] = (uintptr_t) gregs.r_edi; - regs[REG_INDEX(ESI)] = (uintptr_t) gregs.r_esi; - regs[REG_INDEX(FP)] = (uintptr_t) gregs.r_ebp; - regs[REG_INDEX(SP)] = (uintptr_t) gregs.r_isp; - regs[REG_INDEX(EBX)] = (uintptr_t) gregs.r_ebx; - regs[REG_INDEX(EDX)] = (uintptr_t) gregs.r_edx; - regs[REG_INDEX(ECX)] = (uintptr_t) gregs.r_ecx; - regs[REG_INDEX(EAX)] = (uintptr_t) gregs.r_eax; - regs[REG_INDEX(PC)] = (uintptr_t) gregs.r_eip; - regs[REG_INDEX(CS)] = (uintptr_t) gregs.r_cs; - regs[REG_INDEX(SS)] = (uintptr_t) gregs.r_ss; - -#endif /* i386 */ - -#ifdef amd64 -#define REG_INDEX(reg) sun_jvm_hotspot_debugger_amd64_AMD64ThreadContext_##reg - - regs[REG_INDEX(R15)] = gregs.r_r15; - regs[REG_INDEX(R14)] = gregs.r_r14; - regs[REG_INDEX(R13)] = gregs.r_r13; - regs[REG_INDEX(R12)] = gregs.r_r12; - regs[REG_INDEX(RBP)] = gregs.r_rbp; - regs[REG_INDEX(RBX)] = gregs.r_rbx; - regs[REG_INDEX(R11)] = gregs.r_r11; - regs[REG_INDEX(R10)] = gregs.r_r10; - regs[REG_INDEX(R9)] = gregs.r_r9; - regs[REG_INDEX(R8)] = gregs.r_r8; - regs[REG_INDEX(RAX)] = gregs.r_rax; - regs[REG_INDEX(RCX)] = gregs.r_rcx; - regs[REG_INDEX(RDX)] = gregs.r_rdx; - regs[REG_INDEX(RSI)] = gregs.r_rsi; - regs[REG_INDEX(RDI)] = gregs.r_rdi; - regs[REG_INDEX(RIP)] = gregs.r_rip; - regs[REG_INDEX(CS)] = gregs.r_cs; - regs[REG_INDEX(RSP)] = gregs.r_rsp; - regs[REG_INDEX(SS)] = gregs.r_ss; -// regs[REG_INDEX(FSBASE)] = gregs.fs_base; -// regs[REG_INDEX(GSBASE)] = gregs.gs_base; -// regs[REG_INDEX(DS)] = gregs.ds; -// regs[REG_INDEX(ES)] = gregs.es; -// regs[REG_INDEX(FS)] = gregs.fs; -// regs[REG_INDEX(GS)] = gregs.gs; - -#endif /* amd64 */ - -#if defined(sparc) || defined(sparcv9) - -#define REG_INDEX(reg) sun_jvm_hotspot_debugger_sparc_SPARCThreadContext_##reg - -#ifdef _LP64 - regs[REG_INDEX(R_PSR)] = gregs.tstate; - regs[REG_INDEX(R_PC)] = gregs.tpc; - regs[REG_INDEX(R_nPC)] = gregs.tnpc; - regs[REG_INDEX(R_Y)] = gregs.y; -#else - regs[REG_INDEX(R_PSR)] = gregs.psr; - regs[REG_INDEX(R_PC)] = gregs.pc; - regs[REG_INDEX(R_nPC)] = gregs.npc; - regs[REG_INDEX(R_Y)] = gregs.y; -#endif - regs[REG_INDEX(R_G0)] = 0 ; - regs[REG_INDEX(R_G1)] = gregs.u_regs[0]; - regs[REG_INDEX(R_G2)] = gregs.u_regs[1]; - regs[REG_INDEX(R_G3)] = gregs.u_regs[2]; - regs[REG_INDEX(R_G4)] = gregs.u_regs[3]; - regs[REG_INDEX(R_G5)] = gregs.u_regs[4]; - regs[REG_INDEX(R_G6)] = gregs.u_regs[5]; - regs[REG_INDEX(R_G7)] = gregs.u_regs[6]; - regs[REG_INDEX(R_O0)] = gregs.u_regs[7]; - regs[REG_INDEX(R_O1)] = gregs.u_regs[8]; - regs[REG_INDEX(R_O2)] = gregs.u_regs[ 9]; - regs[REG_INDEX(R_O3)] = gregs.u_regs[10]; - regs[REG_INDEX(R_O4)] = gregs.u_regs[11]; - regs[REG_INDEX(R_O5)] = gregs.u_regs[12]; - regs[REG_INDEX(R_O6)] = gregs.u_regs[13]; - regs[REG_INDEX(R_O7)] = gregs.u_regs[14]; -#endif /* sparc */ - - - (*env)->ReleaseLongArrayElements(env, array, regs, JNI_COMMIT); - return array; -} diff -r af8ab4f90a32 -r 9f3ce373370a src/jdk.hotspot.agent/macosx/native/libsaproc/StubDebuggerLocal.c --- a/src/jdk.hotspot.agent/macosx/native/libsaproc/StubDebuggerLocal.c Wed Mar 21 10:13:49 2018 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2009, 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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include -#include - -#define CHECK_EXCEPTION_(value) if ((*env)->ExceptionOccurred(env)) { return value; } -#define CHECK_EXCEPTION if ((*env)->ExceptionOccurred(env)) { return;} -#define THROW_NEW_DEBUGGER_EXCEPTION_(str, value) { throw_new_debugger_exception(env, str); return value; } -#define THROW_NEW_DEBUGGER_EXCEPTION(str) { throw_new_debugger_exception(env, str); return;} - -static void throw_new_debugger_exception(JNIEnv* env, const char* errMsg) { - (*env)->ThrowNew(env, (*env)->FindClass(env, "sun/jvm/hotspot/debugger/DebuggerException"), errMsg); -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: init0 - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_init0 - (JNIEnv *env, jclass cls) { -} - -JNIEXPORT jint JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getAddressSize - (JNIEnv *env, jclass cls) -{ -#ifdef _LP64 - return 8; -#else - return 4; -#endif - -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: attach0 - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__I - (JNIEnv *env, jobject this_obj, jint jpid) { - - THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the process"); -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: attach0 - * Signature: (Ljava/lang/String;Ljava/lang/String;)V - */ -JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_attach0__Ljava_lang_String_2Ljava_lang_String_2 - (JNIEnv *env, jobject this_obj, jstring execName, jstring coreName) { - THROW_NEW_DEBUGGER_EXCEPTION("Can't attach to the core file"); -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: detach0 - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_detach0 - (JNIEnv *env, jobject this_obj) { -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: lookupByName0 - * Signature: (Ljava/lang/String;Ljava/lang/String;)J - */ -JNIEXPORT jlong JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByName0 - (JNIEnv *env, jobject this_obj, jstring objectName, jstring symbolName) { - return 0; -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: lookupByAddress0 - * Signature: (J)Lsun/jvm/hotspot/debugger/cdbg/ClosestSymbol; - */ -JNIEXPORT jobject JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_lookupByAddress0 - (JNIEnv *env, jobject this_obj, jlong addr) { - return 0; -} - -/* - * Class: sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal - * Method: readBytesFromProcess0 - * Signature: (JJ)Lsun/jvm/hotspot/debugger/ReadResult; - */ -JNIEXPORT jbyteArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_readBytesFromProcess0 - (JNIEnv *env, jobject this_obj, jlong addr, jlong numBytes) { - return 0; -} - -JNIEXPORT jlongArray JNICALL Java_sun_jvm_hotspot_debugger_bsd_BsdDebuggerLocal_getThreadIntegerRegisterSet0 - (JNIEnv *env, jobject this_obj, jint lwp_id) { - return 0; -} diff -r af8ab4f90a32 -r 9f3ce373370a src/jdk.hotspot.agent/macosx/native/libsaproc/ps_proc.c --- a/src/jdk.hotspot.agent/macosx/native/libsaproc/ps_proc.c Wed Mar 21 10:13:49 2018 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,467 +0,0 @@ -/* - * Copyright (c) 2003, 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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "libproc_impl.h" -#include "elfmacros.h" - -// This file has the libproc implementation specific to live process -// For core files, refer to ps_core.c - -static inline uintptr_t align(uintptr_t ptr, size_t size) { - return (ptr & ~(size - 1)); -} - -// --------------------------------------------- -// ptrace functions -// --------------------------------------------- - -// read "size" bytes of data from "addr" within the target process. -// unlike the standard ptrace() function, process_read_data() can handle -// unaligned address - alignment check, if required, should be done -// before calling process_read_data. - -static bool process_read_data(struct ps_prochandle* ph, uintptr_t addr, char *buf, size_t size) { - int rslt; - size_t i, words; - uintptr_t end_addr = addr + size; - uintptr_t aligned_addr = align(addr, sizeof(int)); - - if (aligned_addr != addr) { - char *ptr = (char *)&rslt; - errno = 0; - rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0); - if (errno) { - print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr); - return false; - } - for (; aligned_addr != addr; aligned_addr++, ptr++); - for (; ((intptr_t)aligned_addr % sizeof(int)) && aligned_addr < end_addr; - aligned_addr++) - *(buf++) = *(ptr++); - } - - words = (end_addr - aligned_addr) / sizeof(int); - - // assert((intptr_t)aligned_addr % sizeof(int) == 0); - for (i = 0; i < words; i++) { - errno = 0; - rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0); - if (errno) { - print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr); - return false; - } - *(int *)buf = rslt; - buf += sizeof(int); - aligned_addr += sizeof(int); - } - - if (aligned_addr != end_addr) { - char *ptr = (char *)&rslt; - errno = 0; - rslt = ptrace(PT_READ_D, ph->pid, (caddr_t) aligned_addr, 0); - if (errno) { - print_debug("ptrace(PT_READ_D, ..) failed for %d bytes @ %lx\n", size, addr); - return false; - } - for (; aligned_addr != end_addr; aligned_addr++) - *(buf++) = *(ptr++); - } - return true; -} - -// null implementation for write -static bool process_write_data(struct ps_prochandle* ph, - uintptr_t addr, const char *buf , size_t size) { - return false; -} - -// "user" should be a pointer to a reg -static bool process_get_lwp_regs(struct ps_prochandle* ph, pid_t pid, struct reg *user) { - // we have already attached to all thread 'pid's, just use ptrace call - // to get regset now. Note that we don't cache regset upfront for processes. - if (ptrace(PT_GETREGS, pid, (caddr_t) user, 0) < 0) { - print_debug("ptrace(PTRACE_GETREGS, ...) failed for lwp %d\n", pid); - return false; - } - return true; -} - -// fill in ptrace_lwpinfo for lid -static bool process_get_lwp_info(struct ps_prochandle *ph, lwpid_t lwp_id, void *linfo) { - errno = 0; - ptrace(PT_LWPINFO, lwp_id, linfo, sizeof(struct ptrace_lwpinfo)); - - return (errno == 0)? true: false; -} - -static bool ptrace_continue(pid_t pid, int signal) { - // pass the signal to the process so we don't swallow it - if (ptrace(PT_CONTINUE, pid, NULL, signal) < 0) { - print_debug("ptrace(PTRACE_CONT, ..) failed for %d\n", pid); - return false; - } - return true; -} - -// waits until the ATTACH has stopped the process -// by signal SIGSTOP -static bool ptrace_waitpid(pid_t pid) { - int ret; - int status; - do { - // Wait for debuggee to stop. - ret = waitpid(pid, &status, 0); - if (ret >= 0) { - if (WIFSTOPPED(status)) { - // Any signal will stop the thread, make sure it is SIGSTOP. Otherwise SIGSTOP - // will still be pending and delivered when the process is DETACHED and the process - // will go to sleep. - if (WSTOPSIG(status) == SIGSTOP) { - // Debuggee stopped by SIGSTOP. - return true; - } - if (!ptrace_continue(pid, WSTOPSIG(status))) { - print_error("Failed to correctly attach to VM. VM might HANG! [PTRACE_CONT failed, stopped by %d]\n", WSTOPSIG(status)); - return false; - } - } else { - print_debug("waitpid(): Child process exited/terminated (status = 0x%x)\n", status); - return false; - } - } else { - switch (errno) { - case EINTR: - continue; - break; - case ECHILD: - print_debug("waitpid() failed. Child process pid (%d) does not exist \n", pid); - break; - case EINVAL: - print_debug("waitpid() failed. Invalid options argument.\n"); - break; - default: - print_debug("waitpid() failed. Unexpected error %d\n",errno); - } - return false; - } - } while(true); -} - -// attach to a process/thread specified by "pid" -static bool ptrace_attach(pid_t pid) { - if (ptrace(PT_ATTACH, pid, NULL, 0) < 0) { - print_debug("ptrace(PTRACE_ATTACH, ..) failed for %d\n", pid); - return false; - } else { - return ptrace_waitpid(pid); - } -} - -// ------------------------------------------------------- -// functions for obtaining library information -// ------------------------------------------------------- - -// callback for read_thread_info -static bool add_new_thread(struct ps_prochandle* ph, pthread_t pthread_id, lwpid_t lwp_id) { - return add_thread_info(ph, pthread_id, lwp_id) != NULL; -} - -#if defined(__FreeBSD__) && __FreeBSD_version < 701000 -/* - * TEXT_START_ADDR from binutils/ld/emulparams/.sh - * Not the most robust but good enough. - */ - -#if defined(amd64) || defined(x86_64) -#define TEXT_START_ADDR 0x400000 -#elif defined(i386) -#define TEXT_START_ADDR 0x8048000 -#else -#error TEXT_START_ADDR not defined -#endif - -#define BUF_SIZE (PATH_MAX + NAME_MAX + 1) - -uintptr_t linkmap_addr(struct ps_prochandle *ph) { - uintptr_t ehdr_addr, phdr_addr, dyn_addr, dmap_addr, lmap_addr; - ELF_EHDR ehdr; - ELF_PHDR *phdrs, *phdr; - ELF_DYN *dyns, *dyn; - struct r_debug dmap; - unsigned long hdrs_size; - unsigned int i; - - /* read ELF_EHDR at TEXT_START_ADDR and validate */ - - ehdr_addr = (uintptr_t)TEXT_START_ADDR; - - if (process_read_data(ph, ehdr_addr, (char *)&ehdr, sizeof(ehdr)) != true) { - print_debug("process_read_data failed for ehdr_addr %p\n", ehdr_addr); - return (0); - } - - if (!IS_ELF(ehdr) || - ehdr.e_ident[EI_CLASS] != ELF_TARG_CLASS || - ehdr.e_ident[EI_DATA] != ELF_TARG_DATA || - ehdr.e_ident[EI_VERSION] != EV_CURRENT || - ehdr.e_phentsize != sizeof(ELF_PHDR) || - ehdr.e_version != ELF_TARG_VER || - ehdr.e_machine != ELF_TARG_MACH) { - print_debug("not an ELF_EHDR at %p\n", ehdr_addr); - return (0); - } - - /* allocate space for all ELF_PHDR's and read */ - - phdr_addr = ehdr_addr + ehdr.e_phoff; - hdrs_size = ehdr.e_phnum * sizeof(ELF_PHDR); - - if ((phdrs = malloc(hdrs_size)) == NULL) - return (0); - - if (process_read_data(ph, phdr_addr, (char *)phdrs, hdrs_size) != true) { - print_debug("process_read_data failed for phdr_addr %p\n", phdr_addr); - return (0); - } - - /* find PT_DYNAMIC section */ - - for (i = 0, phdr = phdrs; i < ehdr.e_phnum; i++, phdr++) { - if (phdr->p_type == PT_DYNAMIC) - break; - } - - if (i >= ehdr.e_phnum) { - print_debug("PT_DYNAMIC section not found!\n"); - free(phdrs); - return (0); - } - - /* allocate space and read in ELF_DYN headers */ - - dyn_addr = phdr->p_vaddr; - hdrs_size = phdr->p_memsz; - free(phdrs); - - if ((dyns = malloc(hdrs_size)) == NULL) - return (0); - - if (process_read_data(ph, dyn_addr, (char *)dyns, hdrs_size) != true) { - print_debug("process_read_data failed for dyn_addr %p\n", dyn_addr); - free(dyns); - return (0); - } - - /* find DT_DEBUG */ - - dyn = dyns; - while (dyn->d_tag != DT_DEBUG && dyn->d_tag != DT_NULL) { - dyn++; - } - - if (dyn->d_tag != DT_DEBUG) { - print_debug("failed to find DT_DEBUG\n"); - free(dyns); - return (0); - } - - /* read struct r_debug into dmap */ - - dmap_addr = (uintptr_t)dyn->d_un.d_ptr; - free(dyns); - - if (process_read_data(ph, dmap_addr, (char *)&dmap, sizeof(dmap)) != true) { - print_debug("process_read_data failed for dmap_addr %p\n", dmap_addr); - return (0); - } - - lmap_addr = (uintptr_t)dmap.r_map; - - return (lmap_addr); -} -#endif // __FreeBSD__ && __FreeBSD_version < 701000 - -static bool read_lib_info(struct ps_prochandle* ph) { -#if defined(__FreeBSD__) && __FreeBSD_version >= 701000 - struct kinfo_vmentry *freep, *kve; - int i, cnt; - - freep = kinfo_getvmmap(ph->pid, &cnt); - if (freep == NULL) { - print_debug("can't get vm map for pid\n", ph->pid); - return false; - } - - for (i = 0; i < cnt; i++) { - kve = &freep[i]; - if ((kve->kve_flags & KVME_FLAG_COW) && - kve->kve_path != NULL && - strlen(kve->kve_path) > 0) { - - if (find_lib(ph, kve->kve_path) == false) { - lib_info* lib; - if ((lib = add_lib_info(ph, kve->kve_path, - (uintptr_t) kve->kve_start)) == NULL) - continue; // ignore, add_lib_info prints error - - // we don't need to keep the library open, symtab is already - // built. Only for core dump we need to keep the fd open. - close(lib->fd); - lib->fd = -1; - } - } - } - - free(freep); - - return true; -#else - char *l_name; - struct link_map *lmap; - uintptr_t lmap_addr; - - if ((l_name = malloc(BUF_SIZE)) == NULL) - return false; - - if ((lmap = malloc(sizeof(*lmap))) == NULL) { - free(l_name); - return false; - } - - lmap_addr = linkmap_addr(ph); - - if (lmap_addr == 0) { - free(l_name); - free(lmap); - return false; - } - - do { - if (process_read_data(ph, lmap_addr, (char *)lmap, sizeof(*lmap)) != true) { - print_debug("process_read_data failed for lmap_addr %p\n", lmap_addr); - free (l_name); - free (lmap); - return false; - } - - if (process_read_data(ph, (uintptr_t)lmap->l_name, l_name, - BUF_SIZE) != true) { - print_debug("process_read_data failed for lmap->l_name %p\n", - lmap->l_name); - free (l_name); - free (lmap); - return false; - } - - if (find_lib(ph, l_name) == false) { - lib_info* lib; - if ((lib = add_lib_info(ph, l_name, - (uintptr_t) lmap->l_addr)) == NULL) - continue; // ignore, add_lib_info prints error - - // we don't need to keep the library open, symtab is already - // built. Only for core dump we need to keep the fd open. - close(lib->fd); - lib->fd = -1; - } - lmap_addr = (uintptr_t)lmap->l_next; - } while (lmap->l_next != NULL); - - free (l_name); - free (lmap); - - return true; -#endif -} - -// detach a given pid -static bool ptrace_detach(pid_t pid) { - if (pid && ptrace(PT_DETACH, pid, (caddr_t)1, 0) < 0) { - print_debug("ptrace(PTRACE_DETACH, ..) failed for %d\n", pid); - return false; - } else { - return true; - } -} - -static void process_cleanup(struct ps_prochandle* ph) { - ptrace_detach(ph->pid); -} - -static ps_prochandle_ops process_ops = { - .release= process_cleanup, - .p_pread= process_read_data, - .p_pwrite= process_write_data, - .get_lwp_regs= process_get_lwp_regs, - .get_lwp_info= process_get_lwp_info -}; - -// attach to the process. One and only one exposed stuff -struct ps_prochandle* Pgrab(pid_t pid) { - struct ps_prochandle* ph = NULL; - - if ( (ph = (struct ps_prochandle*) calloc(1, sizeof(struct ps_prochandle))) == NULL) { - print_debug("can't allocate memory for ps_prochandle\n"); - return NULL; - } - - if (ptrace_attach(pid) != true) { - free(ph); - return NULL; - } - - // initialize ps_prochandle - ph->pid = pid; - - // initialize vtable - ph->ops = &process_ops; - - // read library info and symbol tables, must do this before attaching threads, - // as the symbols in the pthread library will be used to figure out - // the list of threads within the same process. - if (read_lib_info(ph) != true) { - ptrace_detach(pid); - free(ph); - return NULL; - } - - // read thread info - read_thread_info(ph, add_new_thread); - - return ph; -} diff -r af8ab4f90a32 -r 9f3ce373370a src/jdk.hotspot.agent/macosx/native/libsaproc/salibelf.c --- a/src/jdk.hotspot.agent/macosx/native/libsaproc/salibelf.c Wed Mar 21 10:13:49 2018 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,126 +0,0 @@ -/* - * Copyright (c) 2003, 2006, 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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include "salibelf.h" -#include -#include -#include - -extern void print_debug(const char*,...); - -// ELF file parsing helpers. Note that we do *not* use libelf here. -int read_elf_header(int fd, ELF_EHDR* ehdr) { - if (pread(fd, ehdr, sizeof (ELF_EHDR), 0) != sizeof (ELF_EHDR) || - memcmp(&ehdr->e_ident[EI_MAG0], ELFMAG, SELFMAG) != 0 || - ehdr->e_version != EV_CURRENT) { - return 0; - } - return 1; -} - -bool is_elf_file(int fd) { - ELF_EHDR ehdr; - return read_elf_header(fd, &ehdr); -} - -// read program header table of an ELF file -ELF_PHDR* read_program_header_table(int fd, ELF_EHDR* hdr) { - ELF_PHDR* phbuf = 0; - // allocate memory for program header table - size_t nbytes = hdr->e_phnum * hdr->e_phentsize; - - if ((phbuf = (ELF_PHDR*) malloc(nbytes)) == NULL) { - print_debug("can't allocate memory for reading program header table\n"); - return NULL; - } - - if (pread(fd, phbuf, nbytes, hdr->e_phoff) != nbytes) { - print_debug("ELF file is truncated! can't read program header table\n"); - free(phbuf); - return NULL; - } - - return phbuf; -} - -// read section header table of an ELF file -ELF_SHDR* read_section_header_table(int fd, ELF_EHDR* hdr) { - ELF_SHDR* shbuf = 0; - // allocate memory for section header table - size_t nbytes = hdr->e_shnum * hdr->e_shentsize; - - if ((shbuf = (ELF_SHDR*) malloc(nbytes)) == NULL) { - print_debug("can't allocate memory for reading section header table\n"); - return NULL; - } - - if (pread(fd, shbuf, nbytes, hdr->e_shoff) != nbytes) { - print_debug("ELF file is truncated! can't read section header table\n"); - free(shbuf); - return NULL; - } - - return shbuf; -} - -// read a particular section's data -void* read_section_data(int fd, ELF_EHDR* ehdr, ELF_SHDR* shdr) { - void *buf = NULL; - if (shdr->sh_type == SHT_NOBITS || shdr->sh_size == 0) { - return buf; - } - if ((buf = calloc(shdr->sh_size, 1)) == NULL) { - print_debug("can't allocate memory for reading section data\n"); - return NULL; - } - if (pread(fd, buf, shdr->sh_size, shdr->sh_offset) != shdr->sh_size) { - free(buf); - print_debug("section data read failed\n"); - return NULL; - } - return buf; -} - -uintptr_t find_base_address(int fd, ELF_EHDR* ehdr) { - uintptr_t baseaddr = (uintptr_t)-1; - int cnt; - ELF_PHDR *phbuf, *phdr; - - // read program header table - if ((phbuf = read_program_header_table(fd, ehdr)) == NULL) { - goto quit; - } - - // the base address of a shared object is the lowest vaddr of - // its loadable segments (PT_LOAD) - for (phdr = phbuf, cnt = 0; cnt < ehdr->e_phnum; cnt++, phdr++) { - if (phdr->p_type == PT_LOAD && phdr->p_vaddr < baseaddr) { - baseaddr = phdr->p_vaddr; - } - } - -quit: - if (phbuf) free(phbuf); - return baseaddr; -} diff -r af8ab4f90a32 -r 9f3ce373370a src/jdk.hotspot.agent/macosx/native/libsaproc/test.c --- a/src/jdk.hotspot.agent/macosx/native/libsaproc/test.c Wed Mar 21 10:13:49 2018 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2003, 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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include -#include -#include "libproc.h" - -int main(int argc, char** argv) { - struct ps_prochandle* ph; - - init_libproc(true); - switch (argc) { - case 2: { - // process - ph = Pgrab(atoi(argv[1])); - break; - } - - case 3: { - // core - ph = Pgrab_core(argv[1], argv[2]); - break; - } - - default: { - fprintf(stderr, "usage %s or %s \n", argv[0], argv[0]); - return 1; - } - } - - if (ph) { - Prelease(ph); - return 0; - } else { - printf("can't connect to debuggee\n"); - return 1; - } -} diff -r af8ab4f90a32 -r 9f3ce373370a src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java --- a/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java Wed Mar 21 10:13:49 2018 +0100 +++ b/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/debugger/windbg/WindbgDebuggerLocal.java Wed Mar 21 12:54:36 2018 +0100 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2017, 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 @@ -510,7 +510,7 @@ static { /* - * sawindbg.dll depends on dbgeng.dll which itself depends on + * saproc.dll depends on dbgeng.dll which itself depends on * dbghelp.dll. We have to make sure that the dbgeng.dll and * dbghelp.dll that we load are compatible with each other. We * load both of those libraries from the same directory based @@ -538,18 +538,18 @@ String dbgengPath = null; String dbghelpPath = null; - String sawindbgPath = null; + String saprocPath = null; List searchList = new ArrayList(); boolean loadLibraryDEBUG = System.getProperty("sun.jvm.hotspot.loadLibrary.DEBUG") != null; { - // First place to search is co-located with sawindbg.dll in + // First place to search is co-located with saproc.dll in // $JAVA_HOME/jre/bin (java.home property is set to $JAVA_HOME/jre): searchList.add(System.getProperty("java.home") + File.separator + "bin"); - sawindbgPath = (String) searchList.get(0) + File.separator + - "sawindbg.dll"; + saprocPath = (String) searchList.get(0) + File.separator + + "saproc.dll"; // second place to search is specified by an environment variable: String DTFWHome = System.getenv("DEBUGGINGTOOLSFORWINDOWS"); @@ -646,11 +646,11 @@ } System.load(dbgengPath); - // Now, load sawindbg.dll + // Now, load saproc.dll if (loadLibraryDEBUG) { - System.err.println("DEBUG: loading '" + sawindbgPath + "'."); + System.err.println("DEBUG: loading '" + saprocPath + "'."); } - System.load(sawindbgPath); + System.load(saprocPath); // where do I find '.exe', '.dll' files? imagePath = System.getProperty("sun.jvm.hotspot.debugger.windbg.imagePath"); diff -r af8ab4f90a32 -r 9f3ce373370a src/jdk.hotspot.agent/solaris/native/libsaproc/saproc_audit.cpp --- a/src/jdk.hotspot.agent/solaris/native/libsaproc/saproc_audit.cpp Wed Mar 21 10:13:49 2018 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,98 +0,0 @@ -/* - * Copyright (c) 2009, 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. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - * - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -// This class sets up an interposer on open calls from libproc.so to -// support a pathmap facility in the SA. - -static uintptr_t* libproc_cookie; -static uintptr_t* libc_cookie; -static uintptr_t* libsaproc_cookie; - - -uint_t -la_version(uint_t version) -{ - return (LAV_CURRENT); -} - - -uint_t -la_objopen(Link_map * lmp, Lmid_t lmid, uintptr_t * cookie) -{ - if (strstr(lmp->l_name, "/libproc.so") != NULL) { - libproc_cookie = cookie; - return LA_FLG_BINDFROM; - } - if (strstr(lmp->l_name, "/libc.so") != NULL) { - libc_cookie = cookie; - return LA_FLG_BINDTO; - } - if (strstr(lmp->l_name, "/libsaproc.so") != NULL) { - libsaproc_cookie = cookie; - return LA_FLG_BINDTO | LA_FLG_BINDFROM; - } - return 0; -} - - -#if defined(_LP64) -uintptr_t -la_symbind64(Elf64_Sym *symp, uint_t symndx, uintptr_t *refcook, - uintptr_t *defcook, uint_t *sb_flags, const char *sym_name) -#else -uintptr_t -la_symbind32(Elf32_Sym *symp, uint_t symndx, uintptr_t *refcook, - uintptr_t *defcook, uint_t *sb_flags) -#endif -{ -#if !defined(_LP64) - const char *sym_name = (const char *)symp->st_name; -#endif - if (strcmp(sym_name, "open") == 0 && refcook == libproc_cookie) { - // redirect all open calls from libproc.so through libsaproc_open which will - // try the alternate library locations first. - void* handle = dlmopen(LM_ID_BASE, "libsaproc.so", RTLD_NOLOAD); - if (handle == NULL) { - fprintf(stderr, "libsaproc_audit.so: didn't find libsaproc.so during linking\n"); - } else { - uintptr_t libsaproc_open = (uintptr_t)dlsym(handle, "libsaproc_open"); - if (libsaproc_open == 0) { - fprintf(stderr, "libsaproc_audit.so: didn't find libsaproc_open during linking\n"); - } else { - return libsaproc_open; - } - } - } - return symp->st_value; -} diff -r af8ab4f90a32 -r 9f3ce373370a src/jdk.hotspot.agent/windows/native/libsaproc/sawindbg.cpp --- a/src/jdk.hotspot.agent/windows/native/libsaproc/sawindbg.cpp Wed Mar 21 10:13:49 2018 +0100 +++ b/src/jdk.hotspot.agent/windows/native/libsaproc/sawindbg.cpp Wed Mar 21 12:54:36 2018 +0100 @@ -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 @@ -43,10 +43,6 @@ #include #include -#ifndef STDMETHODV -#define STDMETHODV(method) virtual HRESULT STDMETHODVCALLTYPE method -#endif - #define DEBUG_NO_IMPLEMENTATION #include #include