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