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