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