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