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