ltrace.h revision 65b53df7fa2577c4138aef86c115873eab684a0a
1#ifndef _HCK_LTRACE_H 2#define _HCK_LTRACE_H 3 4#include <sys/types.h> 5#include <sys/time.h> 6#include <stdio.h> 7 8#include "defs.h" 9#include "dict.h" 10 11/* BREAKPOINT_LENGTH is defined in "sysdep.h" */ 12#include "sysdep.h" 13 14#define MAX_LIBRARY 30 15 16#if defined HAVE_LIBIBERTY || defined HAVE_LIBSUPC__ 17# define USE_DEMANGLE 18#endif 19 20extern char *command; 21 22extern int exiting; /* =1 if we have to exit ASAP */ 23 24struct breakpoint { 25 void *addr; 26 unsigned char orig_value[BREAKPOINT_LENGTH]; 27 int enabled; 28 struct library_symbol *libsym; 29}; 30 31enum arg_type { 32 ARGTYPE_UNKNOWN = -1, 33 ARGTYPE_VOID, 34 ARGTYPE_INT, 35 ARGTYPE_UINT, 36 ARGTYPE_LONG, 37 ARGTYPE_ULONG, 38 ARGTYPE_OCTAL, 39 ARGTYPE_CHAR, 40 ARGTYPE_SHORT, 41 ARGTYPE_USHORT, 42 ARGTYPE_FLOAT, /* float value, may require index */ 43 ARGTYPE_DOUBLE, /* double value, may require index */ 44 ARGTYPE_ADDR, 45 ARGTYPE_FILE, 46 ARGTYPE_FORMAT, /* printf-like format */ 47 ARGTYPE_STRING, /* NUL-terminated string */ 48 ARGTYPE_STRING_N, /* String of known maxlen */ 49 ARGTYPE_ARRAY, /* Series of values in memory */ 50 ARGTYPE_ENUM, /* Enumeration */ 51 ARGTYPE_STRUCT, /* Structure of values */ 52 ARGTYPE_IGNORE, /* Leave parameter blank */ 53 ARGTYPE_POINTER, /* Pointer to some other type */ 54 ARGTYPE_COUNT /* number of ARGTYPE_* values */ 55}; 56 57typedef struct arg_type_info_t { 58 enum arg_type type; 59 int arg_num; 60 union { 61 // ARGTYPE_ENUM 62 struct { 63 size_t entries; 64 char **keys; 65 int *values; 66 } enum_info; 67 68 // ARGTYPE_ARRAY 69 struct { 70 struct arg_type_info_t *elt_type; 71 size_t elt_size; 72 int len_spec; 73 } array_info; 74 75 // ARGTYPE_STRING_N 76 struct { 77 int size_spec; 78 } string_n_info; 79 80 // ARGTYPE_STRUCT 81 struct { 82 struct arg_type_info_t **fields; // NULL-terminated 83 size_t *offset; 84 size_t size; 85 } struct_info; 86 87 // ARGTYPE_POINTER 88 struct { 89 struct arg_type_info_t *info; 90 } ptr_info; 91 92 // ARGTYPE_FLOAT 93 struct { 94 size_t float_index; 95 } float_info; 96 97 // ARGTYPE_DOUBLE 98 struct { 99 size_t float_index; 100 } double_info; 101 } u; 102} arg_type_info; 103 104enum tof { 105 LT_TOF_NONE = 0, 106 LT_TOF_FUNCTION, /* A real library function */ 107 LT_TOF_FUNCTIONR, /* Return from a real library function */ 108 LT_TOF_SYSCALL, /* A syscall */ 109 LT_TOF_SYSCALLR, /* Return from a syscall */ 110 LT_TOF_STRUCT /* Not a function; read args from struct */ 111}; 112 113struct function { 114 const char *name; 115 arg_type_info *return_info; 116 int num_params; 117 arg_type_info *arg_info[MAX_ARGS]; 118 int params_right; 119 struct function *next; 120}; 121 122enum toplt { 123 LS_TOPLT_NONE = 0, /* PLT not used for this symbol. */ 124 LS_TOPLT_EXEC, /* PLT for this symbol is executable. */ 125 LS_TOPLT_POINT /* PLT for this symbol is a non-executable. */ 126}; 127 128 129extern struct function *list_of_functions; 130extern char *PLTs_initialized_by_here; 131 132struct library_symbol { 133 char *name; 134 void *enter_addr; 135 struct breakpoint *brkpnt; 136 char needs_init; 137 enum toplt plt_type; 138 char is_weak; 139 struct library_symbol *next; 140}; 141 142struct callstack_element { 143 union { 144 int syscall; 145 struct library_symbol *libfunc; 146 } c_un; 147 int is_syscall; 148 void *return_addr; 149 struct timeval time_spent; 150}; 151 152#define MAX_CALLDEPTH 64 153 154struct process { 155 char *filename; 156 pid_t pid; 157 struct dict *breakpoints; 158 int breakpoints_enabled; /* -1:not enabled yet, 0:disabled, 1:enabled */ 159 int mask_32bit; /* 1 if 64-bit ltrace is tracing 32-bit process. */ 160 unsigned int personality; 161 int tracesysgood; /* signal indicating a PTRACE_SYSCALL trap */ 162 163 int callstack_depth; 164 struct callstack_element callstack[MAX_CALLDEPTH]; 165 struct library_symbol *list_of_symbols; 166 167 /* Arch-dependent: */ 168 void *instruction_pointer; 169 void *stack_pointer; /* To get return addr, args... */ 170 void *return_addr; 171 struct breakpoint *breakpoint_being_enabled; 172 void *arch_ptr; 173 short e_machine; 174 short need_to_reinitialize_breakpoints; 175 176 /* output: */ 177 enum tof type_being_displayed; 178 179 struct process *next; 180}; 181 182struct event { 183 struct process *proc; 184 enum { 185 LT_EV_UNKNOWN, 186 LT_EV_NONE, 187 LT_EV_SIGNAL, 188 LT_EV_EXIT, 189 LT_EV_EXIT_SIGNAL, 190 LT_EV_SYSCALL, 191 LT_EV_SYSRET, 192 LT_EV_BREAKPOINT 193 } thing; 194 union { 195 int ret_val; /* _EV_EXIT */ 196 int signum; /* _EV_SIGNAL, _EV_EXIT_SIGNAL */ 197 int sysnum; /* _EV_SYSCALL, _EV_SYSRET */ 198 void *brk_addr; /* _EV_BREAKPOINT */ 199 } e_un; 200}; 201 202struct opt_c_struct { 203 int count; 204 struct timeval tv; 205}; 206extern struct dict *dict_opt_c; 207 208extern struct process *list_of_processes; 209 210extern void *instruction_pointer; 211 212extern struct event *wait_for_something(void); 213extern void process_event(struct event *event); 214extern void execute_program(struct process *, char **); 215extern int display_arg(enum tof type, struct process *proc, arg_type_info *info); 216extern struct breakpoint *address2bpstruct(struct process *proc, void *addr); 217extern void breakpoints_init(struct process *proc); 218extern void insert_breakpoint(struct process *proc, void *addr, 219 struct library_symbol *libsym); 220extern void delete_breakpoint(struct process *proc, void *addr); 221extern void enable_all_breakpoints(struct process *proc); 222extern void disable_all_breakpoints(struct process *proc); 223extern void reinitialize_breakpoints(struct process *); 224 225extern struct process *open_program(char *filename, pid_t pid); 226extern void open_pid(pid_t pid, int verbose); 227extern void show_summary(void); 228extern arg_type_info *lookup_prototype(enum arg_type at); 229 230/* Arch-dependent stuff: */ 231extern char *pid2name(pid_t pid); 232extern void trace_set_options(struct process *proc, pid_t pid); 233extern void trace_me(void); 234extern int trace_pid(pid_t pid); 235extern void untrace_pid(pid_t pid); 236extern void get_arch_dep(struct process *proc); 237extern void *get_instruction_pointer(struct process *proc); 238extern void set_instruction_pointer(struct process *proc, void *addr); 239extern void *get_stack_pointer(struct process *proc); 240extern void *get_return_addr(struct process *proc, void *stack_pointer); 241extern void enable_breakpoint(pid_t pid, struct breakpoint *sbp); 242extern void disable_breakpoint(pid_t pid, const struct breakpoint *sbp); 243extern int fork_p(struct process *proc, int sysnum); 244extern int exec_p(struct process *proc, int sysnum); 245extern int syscall_p(struct process *proc, int status, int *sysnum); 246extern void continue_process(pid_t pid); 247extern void continue_after_signal(pid_t pid, int signum); 248extern void continue_after_breakpoint(struct process *proc, 249 struct breakpoint *sbp); 250extern void continue_enabling_breakpoint(pid_t pid, struct breakpoint *sbp); 251extern long gimme_arg(enum tof type, struct process *proc, arg_type_info *); 252extern void save_register_args(enum tof type, struct process *proc); 253extern int umovestr(struct process *proc, void *addr, int len, void *laddr); 254extern int umovelong(struct process *proc, void *addr, long *result); 255extern int ffcheck(void *maddr); 256extern void *sym2addr(struct process *, struct library_symbol *); 257 258#if 0 /* not yet */ 259extern int umoven(struct process *proc, void *addr, int len, void *laddr); 260#endif 261 262#endif 263