1 /* 2 * Copyright (c) 2003, 2019, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef _LIBPROC_H_ 26 #define _LIBPROC_H_ 27 28 #include <jni.h> 29 #include <unistd.h> 30 #include <stdint.h> 31 32 #include <sys/procfs.h> 33 #include <sys/ptrace.h> 34 35 36 #if defined(sparc) || defined(sparcv9) || defined(ppc64) || defined(ppc64le) 37 #include <asm/ptrace.h> 38 #define user_regs_struct pt_regs 39 #endif 40 #if defined(aarch64) || defined(arm64) 41 #include <asm/ptrace.h> 42 #define user_regs_struct user_pt_regs 43 #elif defined(arm) 44 #include <asm/ptrace.h> 45 #define user_regs_struct pt_regs 46 #endif 47 48 // This C bool type must be int for compatibility with Linux calls and 49 // it would be a mistake to equivalence it to C++ bool on many platforms 50 51 typedef int bool; 52 #define true 1 53 #define false 0 54 55 struct ps_prochandle; 56 57 // attach to a process 58 JNIEXPORT struct ps_prochandle* JNICALL 59 Pgrab(pid_t pid, char* err_buf, size_t err_buf_len); 60 61 // attach to a core dump 62 JNIEXPORT struct ps_prochandle* JNICALL 63 Pgrab_core(const char* execfile, const char* corefile); 64 65 // release a process or core 66 JNIEXPORT void JNICALL 67 Prelease(struct ps_prochandle* ph); 68 69 // functions not directly available in Solaris libproc 70 71 // initialize libproc (call this only once per app) 72 // pass true to make library verbose 73 JNIEXPORT bool JNICALL 74 init_libproc(bool verbose); 75 76 // get number of threads 77 int get_num_threads(struct ps_prochandle* ph); 78 79 // get lwp_id of n'th thread 80 lwpid_t get_lwp_id(struct ps_prochandle* ph, int index); 81 82 // get regs for a given lwp 83 bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lid, struct user_regs_struct* regs); 84 85 // get number of shared objects 86 int get_num_libs(struct ps_prochandle* ph); 87 88 // get name of n'th lib 89 const char* get_lib_name(struct ps_prochandle* ph, int index); 90 91 // get base of lib 92 uintptr_t get_lib_base(struct ps_prochandle* ph, int index); 93 94 // returns true if given library is found in lib list 95 bool find_lib(struct ps_prochandle* ph, const char *lib_name); 96 97 // symbol lookup 98 uintptr_t lookup_symbol(struct ps_prochandle* ph, const char* object_name, 99 const char* sym_name); 100 101 // address->nearest symbol lookup. return NULL for no symbol 102 const char* symbol_for_pc(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* poffset); 103 104 struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj); 105 106 void throw_new_debugger_exception(JNIEnv* env, const char* errMsg); 107 108 #endif //__LIBPROC_H_