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