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