1 /* 2 * Copyright (c) 2003, 2021, 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(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 #ifndef __cplusplus 51 typedef int bool; 52 #define true 1 53 #define false 0 54 #endif 55 56 struct ps_prochandle; 57 struct lib_info; 58 59 #ifdef __cplusplus 60 extern "C" { 61 #endif 62 63 // attach to a process 64 JNIEXPORT struct ps_prochandle* JNICALL 65 Pgrab(pid_t pid, char* err_buf, size_t err_buf_len); 66 67 // attach to a core dump 68 JNIEXPORT struct ps_prochandle* JNICALL 69 Pgrab_core(const char* execfile, const char* corefile); 70 71 // release a process or core 72 JNIEXPORT void JNICALL 73 Prelease(struct ps_prochandle* ph); 74 75 // functions not directly available in Solaris libproc 76 77 // initialize libproc (call this only once per app) 78 // pass true to make library verbose 79 JNIEXPORT bool JNICALL 80 init_libproc(bool verbose); 81 82 // get number of threads 83 int get_num_threads(struct ps_prochandle* ph); 84 85 // get lwp_id of n'th thread 86 lwpid_t get_lwp_id(struct ps_prochandle* ph, int index); 87 88 // get regs for a given lwp 89 bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lid, struct user_regs_struct* regs); 90 91 // get number of shared objects 92 int get_num_libs(struct ps_prochandle* ph); 93 94 // get name of n'th lib 95 const char* get_lib_name(struct ps_prochandle* ph, int index); 96 97 // get base of lib 98 uintptr_t get_lib_base(struct ps_prochandle* ph, int index); 99 100 // get address range of lib 101 void get_lib_addr_range(struct ps_prochandle* ph, int index, uintptr_t* base, uintptr_t* memsz); 102 103 // returns true if given library is found in lib list 104 bool find_lib(struct ps_prochandle* ph, const char *lib_name); 105 106 // returns lib which contains pc 107 struct lib_info *find_lib_by_address(struct ps_prochandle* ph, uintptr_t pc); 108 109 // symbol lookup 110 uintptr_t lookup_symbol(struct ps_prochandle* ph, const char* object_name, 111 const char* sym_name); 112 113 // address->nearest symbol lookup. return NULL for no symbol 114 const char* symbol_for_pc(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* poffset); 115 116 struct ps_prochandle* get_proc_handle(JNIEnv* env, jobject this_obj); 117 118 void throw_new_debugger_exception(JNIEnv* env, const char* errMsg); 119 120 #ifdef __cplusplus 121 } 122 #endif 123 124 #endif //__LIBPROC_H_