ltrace.h revision 6fa27c330f9e07c5be553614b9c6e2f08461780f
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, 43 ARGTYPE_ADDR, 44 ARGTYPE_FILE, 45 ARGTYPE_FORMAT, /* printf-like format */ 46 ARGTYPE_STRING, /* NUL-terminated string */ 47 ARGTYPE_STRING_N, /* String of known maxlen */ 48 ARGTYPE_ENUM, /* Enumeration */ 49 ARGTYPE_IGNORE, /* Leave parameter blank */ 50 ARGTYPE_POINTER, /* Pointer to some other type */ 51 ARGTYPE_COUNT /* number of ARGTYPE_* values */ 52}; 53 54typedef struct arg_type_info_t { 55 enum arg_type type; 56 union { 57 // ARGTYPE_ENUM 58 struct { 59 size_t entries; 60 char **keys; 61 int *values; 62 } enum_info; 63 64 // ARGTYPE_STRING_N 65 struct { 66 int size_spec; 67 } string_n_info; 68 69 // ARGTYPE_POINTER 70 struct { 71 struct arg_type_info_t *info; 72 } ptr_info; 73 } u; 74} arg_type_info; 75 76enum tof { 77 LT_TOF_NONE = 0, 78 LT_TOF_FUNCTION, /* A real library function */ 79 LT_TOF_FUNCTIONR, /* Return from a real library function */ 80 LT_TOF_SYSCALL, /* A syscall */ 81 LT_TOF_SYSCALLR /* Return from a syscall */ 82}; 83 84struct function { 85 const char *name; 86 arg_type_info *return_info; 87 int num_params; 88 arg_type_info *arg_info[MAX_ARGS]; 89 int params_right; 90 struct function *next; 91}; 92 93enum toplt { 94 LS_TOPLT_NONE = 0, /* PLT not used for this symbol. */ 95 LS_TOPLT_EXEC, /* PLT for this symbol is executable. */ 96 LS_TOPLT_POINT /* PLT for this symbol is a non-executable. */ 97}; 98 99 100extern struct function *list_of_functions; 101extern char *PLTs_initialized_by_here; 102 103struct library_symbol { 104 char *name; 105 void *enter_addr; 106 struct breakpoint *brkpnt; 107 char needs_init; 108 enum toplt plt_type; 109 char is_weak; 110 struct library_symbol *next; 111}; 112 113struct callstack_element { 114 union { 115 int syscall; 116 struct library_symbol *libfunc; 117 } c_un; 118 int is_syscall; 119 void *return_addr; 120 struct timeval time_spent; 121}; 122 123#define MAX_CALLDEPTH 64 124 125struct process { 126 char *filename; 127 pid_t pid; 128 struct dict *breakpoints; 129 int breakpoints_enabled; /* -1:not enabled yet, 0:disabled, 1:enabled */ 130 int mask_32bit; /* 1 if 64-bit ltrace is tracing 32-bit process. */ 131 unsigned int personality; 132 int tracesysgood; /* signal indicating a PTRACE_SYSCALL trap */ 133 134 int callstack_depth; 135 struct callstack_element callstack[MAX_CALLDEPTH]; 136 struct library_symbol *list_of_symbols; 137 138 /* Arch-dependent: */ 139 void *instruction_pointer; 140 void *stack_pointer; /* To get return addr, args... */ 141 void *return_addr; 142 struct breakpoint *breakpoint_being_enabled; 143 void *arch_ptr; 144 short e_machine; 145 short need_to_reinitialize_breakpoints; 146 147 /* output: */ 148 enum tof type_being_displayed; 149 150 struct process *next; 151}; 152 153struct event { 154 struct process *proc; 155 enum { 156 LT_EV_UNKNOWN, 157 LT_EV_NONE, 158 LT_EV_SIGNAL, 159 LT_EV_EXIT, 160 LT_EV_EXIT_SIGNAL, 161 LT_EV_SYSCALL, 162 LT_EV_SYSRET, 163 LT_EV_BREAKPOINT 164 } thing; 165 union { 166 int ret_val; /* _EV_EXIT */ 167 int signum; /* _EV_SIGNAL, _EV_EXIT_SIGNAL */ 168 int sysnum; /* _EV_SYSCALL, _EV_SYSRET */ 169 void *brk_addr; /* _EV_BREAKPOINT */ 170 } e_un; 171}; 172 173struct opt_c_struct { 174 int count; 175 struct timeval tv; 176}; 177extern struct dict *dict_opt_c; 178 179extern struct process *list_of_processes; 180 181extern void *instruction_pointer; 182 183extern struct event *wait_for_something(void); 184extern void process_event(struct event *event); 185extern void execute_program(struct process *, char **); 186extern int display_arg(enum tof type, struct process *proc, int arg_num, 187 arg_type_info *info); 188extern struct breakpoint *address2bpstruct(struct process *proc, void *addr); 189extern void breakpoints_init(struct process *proc); 190extern void insert_breakpoint(struct process *proc, void *addr, 191 struct library_symbol *libsym); 192extern void delete_breakpoint(struct process *proc, void *addr); 193extern void enable_all_breakpoints(struct process *proc); 194extern void disable_all_breakpoints(struct process *proc); 195extern void reinitialize_breakpoints(struct process *); 196 197extern struct process *open_program(char *filename, pid_t pid); 198extern void open_pid(pid_t pid, int verbose); 199extern void show_summary(void); 200extern arg_type_info *lookup_singleton(enum arg_type at); 201 202/* Arch-dependent stuff: */ 203extern char *pid2name(pid_t pid); 204extern void trace_set_options(struct process *proc, pid_t pid); 205extern void trace_me(void); 206extern int trace_pid(pid_t pid); 207extern void untrace_pid(pid_t pid); 208extern void get_arch_dep(struct process *proc); 209extern void *get_instruction_pointer(struct process *proc); 210extern void set_instruction_pointer(struct process *proc, void *addr); 211extern void *get_stack_pointer(struct process *proc); 212extern void *get_return_addr(struct process *proc, void *stack_pointer); 213extern void enable_breakpoint(pid_t pid, struct breakpoint *sbp); 214extern void disable_breakpoint(pid_t pid, const struct breakpoint *sbp); 215extern int fork_p(struct process *proc, int sysnum); 216extern int exec_p(struct process *proc, int sysnum); 217extern int syscall_p(struct process *proc, int status, int *sysnum); 218extern void continue_process(pid_t pid); 219extern void continue_after_signal(pid_t pid, int signum); 220extern void continue_after_breakpoint(struct process *proc, 221 struct breakpoint *sbp); 222extern void continue_enabling_breakpoint(pid_t pid, struct breakpoint *sbp); 223extern long gimme_arg(enum tof type, struct process *proc, int arg_num); 224extern void save_register_args(enum tof type, struct process *proc); 225extern int umovestr(struct process *proc, void *addr, int len, void *laddr); 226extern int umovelong(struct process *proc, void *addr, long *result); 227extern int ffcheck(void *maddr); 228extern void *sym2addr(struct process *, struct library_symbol *); 229 230#if 0 /* not yet */ 231extern int umoven(struct process *proc, void *addr, int len, void *laddr); 232#endif 233 234#endif 235