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_