ltrace.h revision 65b53df7fa2577c4138aef86c115873eab684a0a
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_SHORT,
41	ARGTYPE_USHORT,
42	ARGTYPE_FLOAT,		/* float value, may require index */
43	ARGTYPE_DOUBLE,		/* double value, may require index */
44	ARGTYPE_ADDR,
45	ARGTYPE_FILE,
46	ARGTYPE_FORMAT,		/* printf-like format */
47	ARGTYPE_STRING,		/* NUL-terminated string */
48	ARGTYPE_STRING_N,	/* String of known maxlen */
49        ARGTYPE_ARRAY,		/* Series of values in memory */
50        ARGTYPE_ENUM,		/* Enumeration */
51        ARGTYPE_STRUCT,		/* Structure of values */
52        ARGTYPE_IGNORE,		/* Leave parameter blank */
53        ARGTYPE_POINTER,	/* Pointer to some other type */
54        ARGTYPE_COUNT		/* number of ARGTYPE_* values */
55};
56
57typedef struct arg_type_info_t {
58    enum arg_type type;
59    int arg_num;
60    union {
61	// ARGTYPE_ENUM
62	struct {
63	    size_t entries;
64	    char **keys;
65	    int *values;
66	} enum_info;
67
68	// ARGTYPE_ARRAY
69	struct {
70	    struct arg_type_info_t *elt_type;
71	    size_t elt_size;
72	    int len_spec;
73	} array_info;
74
75	// ARGTYPE_STRING_N
76	struct {
77	    int size_spec;
78	} string_n_info;
79
80	// ARGTYPE_STRUCT
81	struct {
82	    struct arg_type_info_t **fields;	// NULL-terminated
83	    size_t *offset;
84	    size_t size;
85	} struct_info;
86
87	// ARGTYPE_POINTER
88	struct {
89	    struct arg_type_info_t *info;
90	} ptr_info;
91
92        // ARGTYPE_FLOAT
93	struct {
94	    size_t float_index;
95	} float_info;
96
97        // ARGTYPE_DOUBLE
98	struct {
99	    size_t float_index;
100	} double_info;
101    } u;
102} arg_type_info;
103
104enum tof {
105	LT_TOF_NONE = 0,
106	LT_TOF_FUNCTION,	/* A real library function */
107	LT_TOF_FUNCTIONR,	/* Return from a real library function */
108	LT_TOF_SYSCALL,		/* A syscall */
109	LT_TOF_SYSCALLR,	/* Return from a syscall */
110        LT_TOF_STRUCT		/* Not a function; read args from struct */
111};
112
113struct function {
114	const char *name;
115	arg_type_info *return_info;
116	int num_params;
117	arg_type_info *arg_info[MAX_ARGS];
118	int params_right;
119	struct function *next;
120};
121
122enum toplt {
123	LS_TOPLT_NONE = 0,	/* PLT not used for this symbol. */
124	LS_TOPLT_EXEC,		/* PLT for this symbol is executable. */
125	LS_TOPLT_POINT		/* PLT for this symbol is a non-executable. */
126};
127
128
129extern struct function *list_of_functions;
130extern char *PLTs_initialized_by_here;
131
132struct library_symbol {
133	char *name;
134	void *enter_addr;
135	struct breakpoint *brkpnt;
136	char needs_init;
137	enum toplt plt_type;
138	char is_weak;
139	struct library_symbol *next;
140};
141
142struct callstack_element {
143	union {
144		int syscall;
145		struct library_symbol *libfunc;
146	} c_un;
147	int is_syscall;
148	void *return_addr;
149	struct timeval time_spent;
150};
151
152#define MAX_CALLDEPTH 64
153
154struct process {
155	char *filename;
156	pid_t pid;
157	struct dict *breakpoints;
158	int breakpoints_enabled;	/* -1:not enabled yet, 0:disabled, 1:enabled */
159	int mask_32bit;		/* 1 if 64-bit ltrace is tracing 32-bit process.  */
160	unsigned int personality;
161	int tracesysgood;	/* signal indicating a PTRACE_SYSCALL trap */
162
163	int callstack_depth;
164	struct callstack_element callstack[MAX_CALLDEPTH];
165	struct library_symbol *list_of_symbols;
166
167	/* Arch-dependent: */
168	void *instruction_pointer;
169	void *stack_pointer;	/* To get return addr, args... */
170	void *return_addr;
171	struct breakpoint *breakpoint_being_enabled;
172	void *arch_ptr;
173	short e_machine;
174	short need_to_reinitialize_breakpoints;
175
176	/* output: */
177	enum tof type_being_displayed;
178
179	struct process *next;
180};
181
182struct event {
183	struct process *proc;
184	enum {
185		LT_EV_UNKNOWN,
186		LT_EV_NONE,
187		LT_EV_SIGNAL,
188		LT_EV_EXIT,
189		LT_EV_EXIT_SIGNAL,
190		LT_EV_SYSCALL,
191		LT_EV_SYSRET,
192		LT_EV_BREAKPOINT
193	} thing;
194	union {
195		int ret_val;	/* _EV_EXIT */
196		int signum;	/* _EV_SIGNAL, _EV_EXIT_SIGNAL */
197		int sysnum;	/* _EV_SYSCALL, _EV_SYSRET */
198		void *brk_addr;	/* _EV_BREAKPOINT */
199	} e_un;
200};
201
202struct opt_c_struct {
203	int count;
204	struct timeval tv;
205};
206extern struct dict *dict_opt_c;
207
208extern struct process *list_of_processes;
209
210extern void *instruction_pointer;
211
212extern struct event *wait_for_something(void);
213extern void process_event(struct event *event);
214extern void execute_program(struct process *, char **);
215extern int display_arg(enum tof type, struct process *proc, arg_type_info *info);
216extern struct breakpoint *address2bpstruct(struct process *proc, void *addr);
217extern void breakpoints_init(struct process *proc);
218extern void insert_breakpoint(struct process *proc, void *addr,
219			      struct library_symbol *libsym);
220extern void delete_breakpoint(struct process *proc, void *addr);
221extern void enable_all_breakpoints(struct process *proc);
222extern void disable_all_breakpoints(struct process *proc);
223extern void reinitialize_breakpoints(struct process *);
224
225extern struct process *open_program(char *filename, pid_t pid);
226extern void open_pid(pid_t pid, int verbose);
227extern void show_summary(void);
228extern arg_type_info *lookup_prototype(enum arg_type at);
229
230/* Arch-dependent stuff: */
231extern char *pid2name(pid_t pid);
232extern void trace_set_options(struct process *proc, pid_t pid);
233extern void trace_me(void);
234extern int trace_pid(pid_t pid);
235extern void untrace_pid(pid_t pid);
236extern void get_arch_dep(struct process *proc);
237extern void *get_instruction_pointer(struct process *proc);
238extern void set_instruction_pointer(struct process *proc, void *addr);
239extern void *get_stack_pointer(struct process *proc);
240extern void *get_return_addr(struct process *proc, void *stack_pointer);
241extern void enable_breakpoint(pid_t pid, struct breakpoint *sbp);
242extern void disable_breakpoint(pid_t pid, const struct breakpoint *sbp);
243extern int fork_p(struct process *proc, int sysnum);
244extern int exec_p(struct process *proc, int sysnum);
245extern int syscall_p(struct process *proc, int status, int *sysnum);
246extern void continue_process(pid_t pid);
247extern void continue_after_signal(pid_t pid, int signum);
248extern void continue_after_breakpoint(struct process *proc,
249				      struct breakpoint *sbp);
250extern void continue_enabling_breakpoint(pid_t pid, struct breakpoint *sbp);
251extern long gimme_arg(enum tof type, struct process *proc, arg_type_info *);
252extern void save_register_args(enum tof type, struct process *proc);
253extern int umovestr(struct process *proc, void *addr, int len, void *laddr);
254extern int umovelong(struct process *proc, void *addr, long *result);
255extern int ffcheck(void *maddr);
256extern void *sym2addr(struct process *, struct library_symbol *);
257
258#if 0				/* not yet */
259extern int umoven(struct process *proc, void *addr, int len, void *laddr);
260#endif
261
262#endif
263