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