ltrace.h revision 28f60197b93b45422a73e5d1a6aa581584d6c4a5
1#ifndef _HCK_LTRACE_H
2#define _HCK_LTRACE_H
3
4#include <sys/types.h>
5#include <stdio.h>
6
7#include "defs.h"
8
9/* BREAKPOINT_LENGTH is defined in "sysdep.h" */
10#include "sysdep.h"
11
12extern char * command;
13
14extern int exiting;		/* =1 if we have to exit ASAP */
15
16struct breakpoint {
17	void * addr;
18	unsigned char orig_value[BREAKPOINT_LENGTH];
19	int enabled;
20};
21
22enum param_type {
23	LT_PT_UNKNOWN=-1,
24	LT_PT_VOID,
25	LT_PT_INT,
26	LT_PT_UINT,
27	LT_PT_OCTAL,
28	LT_PT_CHAR,
29	LT_PT_ADDR,
30	LT_PT_FILE,
31	LT_PT_FORMAT,		/* printf-like format */
32	LT_PT_STRING,
33	LT_PT_STRING0,		/* stringN: string up to (arg N) bytes */
34	LT_PT_STRING1,
35	LT_PT_STRING2,
36	LT_PT_STRING3
37};
38
39enum tof {
40	LT_TOF_NONE,
41	LT_TOF_FUNCTION,	/* A real library function */
42	LT_TOF_SYSCALL		/* A syscall */
43};
44
45struct function {
46	const char * name;
47	enum param_type return_type;
48	int num_params;
49	enum param_type param_types[MAX_ARGS];
50	int params_right;
51	struct function * next;
52};
53
54extern struct function * list_of_functions;
55
56struct library_symbol {
57	char * name;
58	struct breakpoint brk;
59
60	struct library_symbol * next;
61};
62
63struct process {
64	char * filename;
65	pid_t pid;
66	int breakpoints_enabled;	/* -1:not enabled yet, 0:disabled, 1:enabled */
67
68	int current_syscall;			/* -1 for none */
69	struct library_symbol * current_symbol;	/* NULL for none */
70
71	struct breakpoint return_value;
72	struct library_symbol * list_of_symbols;
73
74	/* Arch-dependent: */
75	void * instruction_pointer;
76	void * stack_pointer;		/* To get return addr, args... */
77	void * return_addr;
78	struct breakpoint * breakpoint_being_enabled;
79
80	/* output: */
81	enum tof type_being_displayed;
82
83	struct process * next;
84};
85
86struct event {
87	struct process *proc;
88	enum {
89		LT_EV_UNKNOWN,
90		LT_EV_NONE,
91		LT_EV_SIGNAL,
92		LT_EV_EXIT,
93		LT_EV_EXIT_SIGNAL,
94		LT_EV_SYSCALL,
95		LT_EV_SYSRET,
96		LT_EV_BREAKPOINT
97	} thing;
98	union {
99		int ret_val;		/* _EV_EXIT */
100		int signum;		/* _EV_SIGNAL, _EV_EXIT_SIGNAL */
101		int sysnum;		/* _EV_SYSCALL, _EV_SYSRET */
102		void * brk_addr;	/* _EV_BREAKPOINT */
103	} e_un;
104};
105
106extern struct process * list_of_processes;
107
108extern void * instruction_pointer;
109
110extern struct event * wait_for_something(void);
111extern void process_event(struct event * event);
112extern void execute_program(struct process *, char **);
113extern int display_arg(enum tof type, struct process * proc, int arg_num, enum param_type rt);
114extern void enable_all_breakpoints(struct process * proc);
115extern void disable_all_breakpoints(struct process * proc);
116extern struct process * open_program(char * filename);
117extern void open_pid(pid_t pid, int verbose);
118
119
120/* Arch-dependent stuff: */
121extern char * pid2name(pid_t pid);
122extern void trace_me(void);
123extern int trace_pid(pid_t pid);
124extern void untrace_pid(pid_t pid);
125extern void * get_instruction_pointer(int pid);
126extern void * get_stack_pointer(int pid);
127extern void * get_return_addr(int pid, void * stack_pointer);
128extern void insert_breakpoint(int pid, struct breakpoint * sbp);
129extern void delete_breakpoint(int pid, struct breakpoint * sbp);
130extern int fork_p(int sysnum);
131extern int exec_p(int sysnum);
132extern int syscall_p(struct process * proc, int status, int * sysnum);
133extern void continue_process(pid_t pid);
134extern void continue_after_signal(pid_t pid, int signum);
135extern void continue_after_breakpoint(struct process * proc, struct breakpoint * sbp, int delete_it);
136extern void continue_enabling_breakpoint(pid_t pid, struct breakpoint * sbp);
137extern long gimme_arg(enum tof type, struct process * proc, int arg_num);
138extern int umovestr(struct process * proc, void * addr, int len, void * laddr);
139#if 0	/* not yet */
140extern int umoven(struct process * proc, void * addr, int len, void * laddr);
141#endif
142
143
144#endif
145