common.h revision 9a5420c82a2fd81681572a2e3859ea1671c3bded
1#ifndef COMMON_H
2#define COMMON_H
3
4#include <config.h>
5#if defined(HAVE_LIBUNWIND)
6#include <libunwind.h>
7#endif /* defined(HAVE_LIBUNWIND) */
8
9#include <sys/types.h>
10#include <sys/time.h>
11#include <stdio.h>
12
13#include "ltrace.h"
14#include "defs.h"
15#include "dict.h"
16#include "sysdep.h"
17#include "debug.h"
18#include "ltrace-elf.h"
19#include "read_config_file.h"
20
21#if defined HAVE_LIBIBERTY || defined HAVE_LIBSUPC__
22# define USE_DEMANGLE
23#endif
24
25extern char * command;
26
27extern int exiting;  /* =1 if we have to exit ASAP */
28
29typedef struct Breakpoint Breakpoint;
30struct Breakpoint {
31	void * addr;
32	unsigned char orig_value[BREAKPOINT_LENGTH];
33	int enabled;
34	struct library_symbol * libsym;
35#ifdef __arm__
36	int thumb_mode;
37#endif
38};
39
40enum arg_type {
41	ARGTYPE_UNKNOWN = -1,
42	ARGTYPE_VOID,
43	ARGTYPE_INT,
44	ARGTYPE_UINT,
45	ARGTYPE_LONG,
46	ARGTYPE_ULONG,
47	ARGTYPE_OCTAL,
48	ARGTYPE_CHAR,
49	ARGTYPE_SHORT,
50	ARGTYPE_USHORT,
51	ARGTYPE_FLOAT,		/* float value, may require index */
52	ARGTYPE_DOUBLE,		/* double value, may require index */
53	ARGTYPE_ADDR,
54	ARGTYPE_FILE,
55	ARGTYPE_FORMAT,		/* printf-like format */
56	ARGTYPE_STRING,		/* NUL-terminated string */
57	ARGTYPE_STRING_N,	/* String of known maxlen */
58	ARGTYPE_ARRAY,		/* Series of values in memory */
59	ARGTYPE_ENUM,		/* Enumeration */
60	ARGTYPE_STRUCT,		/* Structure of values */
61	ARGTYPE_POINTER,	/* Pointer to some other type */
62	ARGTYPE_COUNT		/* number of ARGTYPE_* values */
63};
64
65typedef struct arg_type_info_t {
66	enum arg_type type;
67	union {
68		/* ARGTYPE_ENUM */
69		struct {
70			size_t entries;
71			char ** keys;
72			int * values;
73		} enum_info;
74
75		/* ARGTYPE_ARRAY */
76		struct {
77			struct arg_type_info_t * elt_type;
78			size_t elt_size;
79			int len_spec;
80		} array_info;
81
82		/* ARGTYPE_STRING_N */
83		struct {
84			int size_spec;
85		} string_n_info;
86
87		/* ARGTYPE_STRUCT */
88		struct {
89			struct arg_type_info_t ** fields;	/* NULL-terminated */
90			size_t * offset;
91			size_t size;
92		} struct_info;
93
94		/* ARGTYPE_POINTER */
95		struct {
96			struct arg_type_info_t * info;
97		} ptr_info;
98
99		/* ARGTYPE_FLOAT */
100		struct {
101			size_t float_index;
102		} float_info;
103
104		/* ARGTYPE_DOUBLE */
105		struct {
106			size_t float_index;
107		} double_info;
108	} u;
109} arg_type_info;
110
111enum tof {
112	LT_TOF_NONE = 0,
113	LT_TOF_FUNCTION,	/* A real library function */
114	LT_TOF_FUNCTIONR,	/* Return from a real library function */
115	LT_TOF_SYSCALL,		/* A syscall */
116	LT_TOF_SYSCALLR,	/* Return from a syscall */
117	LT_TOF_STRUCT		/* Not a function; read args from struct */
118};
119
120typedef struct Function Function;
121struct Function {
122	const char * name;
123	arg_type_info * return_info;
124	int num_params;
125	arg_type_info * arg_info[MAX_ARGS];
126	int params_right;
127	Function * next;
128};
129
130enum toplt {
131	LS_TOPLT_NONE = 0,	/* PLT not used for this symbol. */
132	LS_TOPLT_EXEC,		/* PLT for this symbol is executable. */
133	LS_TOPLT_POINT		/* PLT for this symbol is a non-executable. */
134};
135
136extern Function * list_of_functions;
137extern char *PLTs_initialized_by_here;
138
139struct library_symbol {
140	char * name;
141	void * enter_addr;
142	char needs_init;
143	enum toplt plt_type;
144	char is_weak;
145	struct library_symbol * next;
146};
147
148struct callstack_element {
149	union {
150		int syscall;
151		struct library_symbol * libfunc;
152	} c_un;
153	int is_syscall;
154	void * return_addr;
155	struct timeval time_spent;
156	void * arch_ptr;
157};
158
159#define MAX_CALLDEPTH 64
160
161typedef enum Process_State Process_State;
162enum Process_State {
163	STATE_ATTACHED = 0,
164	STATE_BEING_CREATED,
165	STATE_IGNORED  /* ignore this process (it's a fork and no -f was used) */
166};
167
168/* XXX We would rather have this all organized a little differently,
169 * have Process for the whole group and Task for what's there for
170 * per-thread stuff.  But for now this is the less invasive way of
171 * structuring it.  */
172struct Process {
173	Process_State state;
174	Process * parent;         /* needed by STATE_BEING_CREATED */
175	char * filename;
176	pid_t pid;
177
178	/* Dictionary of breakpoints (which is a mapping
179	 * address->Breakpoint).  This is NULL for non-leader
180	 * processes.  */
181	Dict * breakpoints;
182
183	int breakpoints_enabled;  /* -1:not enabled yet, 0:disabled, 1:enabled */
184	int mask_32bit;           /* 1 if 64-bit ltrace is tracing 32-bit process */
185	unsigned int personality;
186	int tracesysgood;         /* signal indicating a PTRACE_SYSCALL trap */
187
188	int callstack_depth;
189	struct callstack_element callstack[MAX_CALLDEPTH];
190	struct library_symbol * list_of_symbols;
191
192	int libdl_hooked;
193	/* Arch-dependent: */
194	void * debug;	/* arch-dep process debug struct */
195	long debug_state; /* arch-dep debug state */
196	void * instruction_pointer;
197	void * stack_pointer;      /* To get return addr, args... */
198	void * return_addr;
199	Breakpoint * breakpoint_being_enabled;
200	void * arch_ptr;
201	short e_machine;
202	short need_to_reinitialize_breakpoints;
203#ifdef __arm__
204	int thumb_mode;           /* ARM execution mode: 0: ARM, 1: Thumb */
205#endif
206
207#if defined(HAVE_LIBUNWIND)
208	/* libunwind address space */
209	unw_addr_space_t unwind_as;
210	void *unwind_priv;
211#endif /* defined(HAVE_LIBUNWIND) */
212
213	/**
214	 * Process chaining.
215	 **/
216	Process * next;
217
218	/* LEADER points to the leader thread of the POSIX.1 process.
219	   If X->LEADER == X, then X is the leader thread and the
220	   Process structures chained by NEXT represent other threads,
221	   up until, but not including, the next leader thread.
222	   LEADER may be NULL after the leader has already exited.  In
223	   that case this process is waiting to be collected.  */
224	Process * leader;
225};
226
227struct opt_c_struct {
228	int count;
229	struct timeval tv;
230};
231
232#include "options.h"
233#include "output.h"
234#ifdef USE_DEMANGLE
235#include "demangle.h"
236#endif
237
238extern Dict * dict_opt_c;
239
240enum pcb_status {
241	pcb_stop, /* The iteration should stop.  */
242	pcb_cont, /* The iteration should continue.  */
243};
244
245extern Event * next_event(void);
246extern Process * pid2proc(pid_t pid);
247extern void add_process(Process * proc);
248extern void remove_process(Process * proc);
249extern Process *each_process(Process * start,
250			     enum pcb_status (* cb)(Process * proc, void * data),
251			     void * data);
252extern Process *each_task(Process * start,
253			  enum pcb_status (* cb)(Process * proc, void * data),
254			  void * data);
255
256extern void handle_event(Event * event);
257extern pid_t execute_program(const char * command, char ** argv);
258extern int display_arg(enum tof type, Process * proc, int arg_num, arg_type_info * info);
259extern Breakpoint * address2bpstruct(Process * proc, void * addr);
260extern void breakpoints_init(Process * proc, int enable);
261extern void insert_breakpoint(Process * proc, void * addr,
262			      struct library_symbol * libsym, int enable);
263extern void delete_breakpoint(Process * proc, void * addr);
264extern void enable_all_breakpoints(Process * proc);
265extern void disable_all_breakpoints(Process * proc);
266extern void reinitialize_breakpoints(Process *);
267
268extern Process * open_program(char * filename, pid_t pid, int init_breakpoints);
269extern void open_pid(pid_t pid);
270extern void show_summary(void);
271extern arg_type_info * lookup_prototype(enum arg_type at);
272
273extern void do_init_elf(struct ltelf *lte, const char *filename);
274extern void do_close_elf(struct ltelf *lte);
275extern int in_load_libraries(const char *name, struct ltelf *lte, size_t count, GElf_Sym *sym);
276extern struct library_symbol *library_symbols;
277extern void add_library_symbol(GElf_Addr addr, const char *name,
278		struct library_symbol **library_symbolspp,
279		enum toplt type_of_plt, int is_weak);
280
281/* Arch-dependent stuff: */
282extern char * pid2name(pid_t pid);
283extern pid_t process_leader(pid_t pid);
284extern int process_tasks(pid_t pid, pid_t **ret_tasks, size_t *ret_n);
285extern int process_stopped(pid_t pid);
286extern char process_status(pid_t pid);
287extern void trace_set_options(Process * proc, pid_t pid);
288extern void trace_me(void);
289extern int trace_pid(pid_t pid);
290extern void untrace_pid(pid_t pid);
291extern void get_arch_dep(Process * proc);
292extern void * get_instruction_pointer(Process * proc);
293extern void set_instruction_pointer(Process * proc, void * addr);
294extern void * get_stack_pointer(Process * proc);
295extern void * get_return_addr(Process * proc, void * stack_pointer);
296extern void set_return_addr(Process * proc, void * addr);
297extern void enable_breakpoint(Process * proc, Breakpoint * sbp);
298extern void disable_breakpoint(Process * proc, Breakpoint * sbp);
299extern int syscall_p(Process * proc, int status, int * sysnum);
300extern void continue_process(pid_t pid);
301extern void continue_after_signal(pid_t pid, int signum);
302extern void continue_after_breakpoint(Process * proc, Breakpoint * sbp);
303extern void continue_enabling_breakpoint(Process * proc, Breakpoint * sbp);
304extern long gimme_arg(enum tof type, Process * proc, int arg_num, arg_type_info * info);
305extern void save_register_args(enum tof type, Process * proc);
306extern int umovestr(Process * proc, void * addr, int len, void * laddr);
307extern int umovelong (Process * proc, void * addr, long * result, arg_type_info * info);
308extern size_t umovebytes (Process *proc, void * addr, void * laddr, size_t count);
309extern int ffcheck(void * maddr);
310extern void * sym2addr(Process *, struct library_symbol *);
311extern int linkmap_init(Process *, struct ltelf *);
312extern void arch_check_dbg(Process *proc);
313extern int task_kill (pid_t pid, int sig);
314
315
316extern struct ltelf main_lte;
317
318#endif
319