ltrace.h revision 5df6269b86c84f9e5d311aeb142cfe85f8db8db8
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};
29
30enum arg_type {
31	ARGTYPE_UNKNOWN=-1,
32	ARGTYPE_VOID,
33	ARGTYPE_INT,
34	ARGTYPE_UINT,
35	ARGTYPE_LONG,
36	ARGTYPE_ULONG,
37	ARGTYPE_OCTAL,
38	ARGTYPE_CHAR,
39	ARGTYPE_ADDR,
40	ARGTYPE_FILE,
41	ARGTYPE_FORMAT,     /* printf-like format */
42	ARGTYPE_STRING,
43	ARGTYPE_STRINGN,
44};
45
46struct complete_arg_type {
47	enum arg_type at;
48	int argno;		/* for STRINGN */
49};
50
51enum tof {
52	LT_TOF_NONE=0,
53	LT_TOF_FUNCTION,	/* A real library function */
54	LT_TOF_FUNCTIONR,	/* Return from a real library function */
55	LT_TOF_SYSCALL,		/* A syscall */
56	LT_TOF_SYSCALLR		/* Return from a syscall */
57};
58
59struct function {
60	const char * name;
61	struct complete_arg_type return_type;
62	int num_params;
63	struct complete_arg_type arg_types[MAX_ARGS];
64	int params_right;
65	struct function * next;
66};
67
68extern struct function * list_of_functions;
69
70struct library_symbol {
71	char * name;
72	void * enter_addr;
73
74	struct library_symbol * next;
75};
76
77struct callstack_element {
78	union {
79		int syscall;
80		struct library_symbol * libfunc;
81	} c_un;
82	int is_syscall;
83	void * return_addr;
84	struct timeval time_spent;
85};
86
87#define MAX_CALLDEPTH 64
88
89struct process {
90	char * filename;
91	pid_t pid;
92	struct dict * breakpoints;
93	int breakpoints_enabled;	/* -1:not enabled yet, 0:disabled, 1:enabled */
94
95	int callstack_depth;
96	struct callstack_element callstack[MAX_CALLDEPTH];
97	struct library_symbol * list_of_symbols;
98
99	/* Arch-dependent: */
100	void * instruction_pointer;
101	void * stack_pointer;		/* To get return addr, args... */
102	void * return_addr;
103	struct breakpoint * breakpoint_being_enabled;
104	void * arch_ptr;
105
106	/* output: */
107	enum tof type_being_displayed;
108
109	struct process * next;
110};
111
112struct event {
113	struct process *proc;
114	enum {
115		LT_EV_UNKNOWN,
116		LT_EV_NONE,
117		LT_EV_SIGNAL,
118		LT_EV_EXIT,
119		LT_EV_EXIT_SIGNAL,
120		LT_EV_SYSCALL,
121		LT_EV_SYSRET,
122		LT_EV_BREAKPOINT
123	} thing;
124	union {
125		int ret_val;		/* _EV_EXIT */
126		int signum;		/* _EV_SIGNAL, _EV_EXIT_SIGNAL */
127		int sysnum;		/* _EV_SYSCALL, _EV_SYSRET */
128		void * brk_addr;	/* _EV_BREAKPOINT */
129	} e_un;
130};
131
132struct opt_c_struct {
133	int count;
134	struct timeval tv;
135};
136extern struct dict * dict_opt_c;
137
138extern struct process * list_of_processes;
139
140extern void * instruction_pointer;
141
142extern struct event * wait_for_something(void);
143extern void process_event(struct event * event);
144extern void execute_program(struct process *, char **);
145extern int display_arg(enum tof type, struct process * proc, int arg_num, const struct complete_arg_type *at);
146extern struct breakpoint * address2bpstruct(struct process * proc, void * addr);
147extern void breakpoints_init(struct process * proc);
148extern void insert_breakpoint(struct process * proc, void * addr);
149extern void delete_breakpoint(struct process * proc, void * addr);
150extern void enable_all_breakpoints(struct process * proc);
151extern void disable_all_breakpoints(struct process * proc);
152extern struct process * open_program(char * filename);
153extern void open_pid(pid_t pid, int verbose);
154extern void show_summary(void);
155
156
157/* Arch-dependent stuff: */
158extern char * pid2name(pid_t pid);
159extern void trace_me(void);
160extern int trace_pid(pid_t pid);
161extern void untrace_pid(pid_t pid);
162extern void get_arch_dep(struct process * proc);
163extern void * get_instruction_pointer(struct process * proc);
164extern void set_instruction_pointer(struct process * proc, void * addr);
165extern void * get_stack_pointer(struct process * proc);
166extern void * get_return_addr(struct process * proc, void * stack_pointer);
167extern void enable_breakpoint(pid_t pid, struct breakpoint * sbp);
168extern void disable_breakpoint(pid_t pid, const struct breakpoint * sbp);
169extern int fork_p(int sysnum);
170extern int exec_p(int sysnum);
171extern int syscall_p(struct process * proc, int status, int * sysnum);
172extern void continue_process(pid_t pid);
173extern void continue_after_signal(pid_t pid, int signum);
174extern void continue_after_breakpoint(struct process * proc, struct breakpoint * sbp);
175extern void continue_enabling_breakpoint(pid_t pid, struct breakpoint * sbp);
176extern long gimme_arg(enum tof type, struct process * proc, int arg_num);
177extern void save_register_args(enum tof type, struct process * proc);
178extern int umovestr(struct process * proc, void * addr, int len, void * laddr);
179extern int ffcheck(void *maddr);
180#if 0	/* not yet */
181extern int umoven(struct process * proc, void * addr, int len, void * laddr);
182#endif
183
184
185#endif
186