ltrace.h revision 9a2ad351a1c3215dc596ff3e2e3fd4bc24445a6b
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, enum arg_type at);
157extern struct breakpoint * address2bpstruct(struct process * proc, void * addr);
158extern void breakpoints_init(struct process * proc);
159extern void insert_breakpoint(struct process * proc, void * addr, struct library_symbol * libsym);
160extern void delete_breakpoint(struct process * proc, void * addr);
161extern void enable_all_breakpoints(struct process * proc);
162extern void disable_all_breakpoints(struct process * proc);
163extern void reinitialize_breakpoints (struct process *);
164
165extern struct process * open_program(char * filename, pid_t pid);
166extern void open_pid(pid_t pid, int verbose);
167extern void show_summary(void);
168
169
170/* Arch-dependent stuff: */
171extern char * pid2name(pid_t pid);
172extern void trace_set_options(struct process * proc, pid_t pid);
173extern void trace_me(void);
174extern int trace_pid(pid_t pid);
175extern void untrace_pid(pid_t pid);
176extern void get_arch_dep(struct process * proc);
177extern void * get_instruction_pointer(struct process * proc);
178extern void set_instruction_pointer(struct process * proc, void * addr);
179extern void * get_stack_pointer(struct process * proc);
180extern void * get_return_addr(struct process * proc, void * stack_pointer);
181extern void enable_breakpoint(pid_t pid, struct breakpoint * sbp);
182extern void disable_breakpoint(pid_t pid, const struct breakpoint * sbp);
183extern int fork_p(struct process * proc, int sysnum);
184extern int exec_p(struct process * proc, int sysnum);
185extern int syscall_p(struct process * proc, int status, int * sysnum);
186extern void continue_process(pid_t pid);
187extern void continue_after_signal(pid_t pid, int signum);
188extern void continue_after_breakpoint(struct process * proc, struct breakpoint * sbp);
189extern void continue_enabling_breakpoint(pid_t pid, struct breakpoint * sbp);
190extern long gimme_arg(enum tof type, struct process * proc, int arg_num);
191extern void save_register_args(enum tof type, struct process * proc);
192extern int umovestr(struct process * proc, void * addr, int len, void * laddr);
193extern int ffcheck(void *maddr);
194extern void * plt2addr(struct process *, void **);
195
196#if 0	/* not yet */
197extern int umoven(struct process * proc, void * addr, int len, void * laddr);
198#endif
199
200
201#endif
202