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