1 /* 2 * Copyright (c) 2003, 2013, 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 <unistd.h> 29 #include <stdint.h> 30 #include <stdarg.h> 31 #include <stdio.h> 32 #include <stdlib.h> 33 #include <string.h> 34 #include <fcntl.h> 35 36 #ifdef __APPLE__ 37 typedef enum ps_err_e { 38 PS_OK, PS_ERR, PS_BADPID, PS_BADLID, 39 PS_BADADDR, PS_NOSYM, PS_NOFREGS 40 } ps_err_e; 41 42 #ifndef psaddr_t 43 #define psaddr_t uintptr_t 44 #endif 45 46 #ifndef bool 47 typedef int bool; 48 #define true 1 49 #define false 0 50 #endif // bool 51 52 #ifndef lwpid_t 53 #define lwpid_t uintptr_t 54 #endif 55 56 #include <mach/thread_status.h> 57 #else // __APPLE__ 58 #include <elf.h> 59 #include <link.h> 60 #include <machine/reg.h> 61 #include <proc_service.h> 62 63 // This C bool type must be int for compatibility with BSD calls and 64 // it would be a mistake to equivalence it to C++ bool on many platforms 65 typedef int bool; 66 #define true 1 67 #define false 0 68 69 #endif // __APPLE__ 70 71 /************************************************************************************ 72 73 0. This is very minimal subset of Solaris libproc just enough for current application. 74 Please note that the bulk of the functionality is from proc_service interface. This 75 adds Pgrab__ and some missing stuff. We hide the difference b/w live process and core 76 file by this interface. 77 78 1. pthread_id is unique. We store this in OSThread::_pthread_id in JVM code. 79 80 2. All threads see the same pid when they call getpid(). 81 We used to save the result of ::getpid() call in OSThread::_thread_id. 82 Because gettid returns actual pid of thread (lwp id), this is 83 unique again. We therefore use OSThread::_thread_id as unique identifier. 84 85 3. There is a unique LWP id under both thread libraries. libthread_db maps pthread_id 86 to its underlying lwp_id under both the thread libraries. thread_info.lwp_id stores 87 lwp_id of the thread. The lwp id is nothing but the actual pid of clone'd processes. But 88 unfortunately libthread_db does not work very well for core dumps. So, we get pthread_id 89 only for processes. For core dumps, we don't use libthread_db at all (like gdb). 90 91 4. ptrace operates on this LWP id under both the thread libraries. When we say 'pid' for 92 ptrace call, we refer to lwp_id of the thread. 93 94 5. for core file, we parse ELF files and read data from them. For processes we use 95 combination of ptrace and /proc calls. 96 97 *************************************************************************************/ 98 99 struct reg; 100 struct ps_prochandle; 101 102 // attach to a process 103 struct ps_prochandle* Pgrab(pid_t pid); 104 105 // attach to a core dump 106 struct ps_prochandle* Pgrab_core(const char* execfile, const char* corefile); 107 108 // release a process or core 109 void Prelease(struct ps_prochandle* ph); 110 111 // functions not directly available in Solaris libproc 112 113 // initialize libproc (call this only once per app) 114 // pass true to make library verbose 115 bool init_libproc(bool verbose); 116 117 // get number of threads 118 int get_num_threads(struct ps_prochandle* ph); 119 120 // get lwp_id of n'th thread 121 lwpid_t get_lwp_id(struct ps_prochandle* ph, int index); 122 123 // get regs for a given lwp 124 bool get_lwp_regs(struct ps_prochandle* ph, lwpid_t lid, struct reg* regs); 125 126 // get number of shared objects 127 int get_num_libs(struct ps_prochandle* ph); 128 129 // get name of n'th lib 130 const char* get_lib_name(struct ps_prochandle* ph, int index); 131 132 // get base of lib 133 uintptr_t get_lib_base(struct ps_prochandle* ph, int index); 134 135 // returns true if given library is found in lib list 136 bool find_lib(struct ps_prochandle* ph, const char *lib_name); 137 138 // symbol lookup 139 uintptr_t lookup_symbol(struct ps_prochandle* ph, const char* object_name, 140 const char* sym_name); 141 142 // address->nearest symbol lookup. return NULL for no symbol 143 const char* symbol_for_pc(struct ps_prochandle* ph, uintptr_t addr, uintptr_t* poffset); 144 145 #endif //__LIBPROC_H_