ltrace.h revision 28f60197b93b45422a73e5d1a6aa581584d6c4a5
1#ifndef _HCK_LTRACE_H 2#define _HCK_LTRACE_H 3 4#include <sys/types.h> 5#include <stdio.h> 6 7#include "defs.h" 8 9/* BREAKPOINT_LENGTH is defined in "sysdep.h" */ 10#include "sysdep.h" 11 12extern char * command; 13 14extern int exiting; /* =1 if we have to exit ASAP */ 15 16struct breakpoint { 17 void * addr; 18 unsigned char orig_value[BREAKPOINT_LENGTH]; 19 int enabled; 20}; 21 22enum param_type { 23 LT_PT_UNKNOWN=-1, 24 LT_PT_VOID, 25 LT_PT_INT, 26 LT_PT_UINT, 27 LT_PT_OCTAL, 28 LT_PT_CHAR, 29 LT_PT_ADDR, 30 LT_PT_FILE, 31 LT_PT_FORMAT, /* printf-like format */ 32 LT_PT_STRING, 33 LT_PT_STRING0, /* stringN: string up to (arg N) bytes */ 34 LT_PT_STRING1, 35 LT_PT_STRING2, 36 LT_PT_STRING3 37}; 38 39enum tof { 40 LT_TOF_NONE, 41 LT_TOF_FUNCTION, /* A real library function */ 42 LT_TOF_SYSCALL /* A syscall */ 43}; 44 45struct function { 46 const char * name; 47 enum param_type return_type; 48 int num_params; 49 enum param_type param_types[MAX_ARGS]; 50 int params_right; 51 struct function * next; 52}; 53 54extern struct function * list_of_functions; 55 56struct library_symbol { 57 char * name; 58 struct breakpoint brk; 59 60 struct library_symbol * next; 61}; 62 63struct process { 64 char * filename; 65 pid_t pid; 66 int breakpoints_enabled; /* -1:not enabled yet, 0:disabled, 1:enabled */ 67 68 int current_syscall; /* -1 for none */ 69 struct library_symbol * current_symbol; /* NULL for none */ 70 71 struct breakpoint return_value; 72 struct library_symbol * list_of_symbols; 73 74 /* Arch-dependent: */ 75 void * instruction_pointer; 76 void * stack_pointer; /* To get return addr, args... */ 77 void * return_addr; 78 struct breakpoint * breakpoint_being_enabled; 79 80 /* output: */ 81 enum tof type_being_displayed; 82 83 struct process * next; 84}; 85 86struct event { 87 struct process *proc; 88 enum { 89 LT_EV_UNKNOWN, 90 LT_EV_NONE, 91 LT_EV_SIGNAL, 92 LT_EV_EXIT, 93 LT_EV_EXIT_SIGNAL, 94 LT_EV_SYSCALL, 95 LT_EV_SYSRET, 96 LT_EV_BREAKPOINT 97 } thing; 98 union { 99 int ret_val; /* _EV_EXIT */ 100 int signum; /* _EV_SIGNAL, _EV_EXIT_SIGNAL */ 101 int sysnum; /* _EV_SYSCALL, _EV_SYSRET */ 102 void * brk_addr; /* _EV_BREAKPOINT */ 103 } e_un; 104}; 105 106extern struct process * list_of_processes; 107 108extern void * instruction_pointer; 109 110extern struct event * wait_for_something(void); 111extern void process_event(struct event * event); 112extern void execute_program(struct process *, char **); 113extern int display_arg(enum tof type, struct process * proc, int arg_num, enum param_type rt); 114extern void enable_all_breakpoints(struct process * proc); 115extern void disable_all_breakpoints(struct process * proc); 116extern struct process * open_program(char * filename); 117extern void open_pid(pid_t pid, int verbose); 118 119 120/* Arch-dependent stuff: */ 121extern char * pid2name(pid_t pid); 122extern void trace_me(void); 123extern int trace_pid(pid_t pid); 124extern void untrace_pid(pid_t pid); 125extern void * get_instruction_pointer(int pid); 126extern void * get_stack_pointer(int pid); 127extern void * get_return_addr(int pid, void * stack_pointer); 128extern void insert_breakpoint(int pid, struct breakpoint * sbp); 129extern void delete_breakpoint(int pid, struct breakpoint * sbp); 130extern int fork_p(int sysnum); 131extern int exec_p(int sysnum); 132extern int syscall_p(struct process * proc, int status, int * sysnum); 133extern void continue_process(pid_t pid); 134extern void continue_after_signal(pid_t pid, int signum); 135extern void continue_after_breakpoint(struct process * proc, struct breakpoint * sbp, int delete_it); 136extern void continue_enabling_breakpoint(pid_t pid, struct breakpoint * sbp); 137extern long gimme_arg(enum tof type, struct process * proc, int arg_num); 138extern int umovestr(struct process * proc, void * addr, int len, void * laddr); 139#if 0 /* not yet */ 140extern int umoven(struct process * proc, void * addr, int len, void * laddr); 141#endif 142 143 144#endif 145