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