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