events.c revision cbe29c6c0ad01839a81272c4715ea73d17e89611
1#include "config.h"
2
3#define	_GNU_SOURCE	1
4#include <stdlib.h>
5#include <sys/types.h>
6#include <sys/wait.h>
7#include <errno.h>
8#include <signal.h>
9#include <string.h>
10#include <sys/ptrace.h>
11#include <assert.h>
12
13#include "common.h"
14
15static Event event;
16
17/* A queue of events that we missed while enabling the
18 * breakpoint in one of tasks.  */
19static Event * delayed_events = NULL;
20static Event * end_delayed_events = NULL;
21
22static enum pcb_status
23first (Process * proc, void * data)
24{
25	return pcb_stop;
26}
27
28void
29enque_event(Event * event)
30{
31	debug(DEBUG_FUNCTION, "%d: queuing event %d for later",
32	      event->proc->pid, event->type);
33	Event * ne = malloc(sizeof(*ne));
34	if (ne == NULL) {
35		perror("event will be missed: malloc");
36		return;
37	}
38
39	*ne = *event;
40	ne->next = NULL;
41	if (end_delayed_events == NULL) {
42		assert(delayed_events == NULL);
43		end_delayed_events = delayed_events = ne;
44	}
45	else {
46		assert(delayed_events != NULL);
47		end_delayed_events = end_delayed_events->next = ne;
48	}
49}
50
51Event *
52each_qd_event(enum ecb_status (*pred)(Event *, void *), void * data)
53{
54	Event * prev = delayed_events;
55	Event * event;
56	for (event = prev; event != NULL; ) {
57		switch ((*pred)(event, data)) {
58		case ecb_cont:
59			prev = event;
60			event = event->next;
61			continue;
62
63		case ecb_deque:
64			debug(DEBUG_FUNCTION, "dequeuing event %d for %d",
65			      event->type,
66			      event->proc != NULL ? event->proc->pid : -1);
67			/*
68			printf("dequeuing event %d for %d\n", event->type,
69			       event->proc != NULL ? event->proc->pid : -1) ;
70			*/
71			if (end_delayed_events == event)
72				end_delayed_events = prev;
73			if (delayed_events == event)
74				delayed_events = event->next;
75			else
76				prev->next = event->next;
77			if (delayed_events == NULL)
78				end_delayed_events = NULL;
79			/* fall-through */
80
81		case ecb_yield:
82			return event;
83		}
84	}
85
86	return NULL;
87}
88
89static enum ecb_status
90event_process_not_reenabling(Event * event, void * data)
91{
92	if (event->proc == NULL
93	    || event->proc->leader == NULL
94	    || event->proc->leader->event_handler == NULL)
95		return ecb_deque;
96	else
97		return ecb_cont;
98}
99
100static Event *
101next_qd_event(void)
102{
103	return each_qd_event(&event_process_not_reenabling, NULL);
104}
105
106Event *
107next_event(void)
108{
109	pid_t pid;
110	int status;
111	int tmp;
112	int stop_signal;
113
114	debug(DEBUG_FUNCTION, "next_event()");
115	Event * ev;
116	if ((ev = next_qd_event()) != NULL) {
117		event = *ev;
118		free(ev);
119		return &event;
120	}
121
122	if (!each_process(NULL, &first, NULL)) {
123		debug(DEBUG_EVENT, "event: No more traced programs: exiting");
124		exit(0);
125	}
126	pid = waitpid(-1, &status, __WALL);
127	if (pid == -1) {
128		if (errno == ECHILD) {
129			debug(DEBUG_EVENT, "event: No more traced programs: exiting");
130			exit(0);
131		} else if (errno == EINTR) {
132			debug(DEBUG_EVENT, "event: none (wait received EINTR?)");
133			event.type = EVENT_NONE;
134			return &event;
135		}
136		perror("wait");
137		exit(1);
138	}
139	event.proc = pid2proc(pid);
140	if (!event.proc || event.proc->state == STATE_BEING_CREATED) {
141		event.type = EVENT_NEW;
142		event.e_un.newpid = pid;
143		debug(DEBUG_EVENT, "event: NEW: pid=%d", pid);
144		return &event;
145	}
146	get_arch_dep(event.proc);
147	debug(3, "event from pid %u", pid);
148	if (event.proc->breakpoints_enabled == -1)
149		trace_set_options(event.proc, event.proc->pid);
150	Process *leader = event.proc->leader;
151	if (leader == event.proc) {
152		if (event.proc->breakpoints_enabled == -1) {
153			event.type = EVENT_NONE;
154			enable_all_breakpoints(event.proc);
155			continue_process(event.proc->pid);
156			debug(DEBUG_EVENT,
157			      "event: NONE: pid=%d (enabling breakpoints)",
158			      pid);
159			return &event;
160		} else if (!event.proc->libdl_hooked) {
161			/* debug struct may not have been written yet.. */
162			if (linkmap_init(event.proc, &main_lte) == 0) {
163				event.proc->libdl_hooked = 1;
164			}
165		}
166	}
167
168	/* The process should be stopped after the waitpid call.  But
169	 * when the whole thread group is terminated, we see
170	 * individual tasks spontaneously transitioning from 't' to
171	 * 'R' and 'Z'.  Calls to ptrace fail and /proc/pid/status may
172	 * not even be available anymore, so we can't check in
173	 * advance.  So we just drop the error checking around ptrace
174	 * calls.  We check for termination ex post when it fails,
175	 * suppress the event, and let the event loop collect the
176	 * termination in the next iteration.  */
177#define CHECK_PROCESS_TERMINATED					\
178	do {								\
179		int errno_save = errno;					\
180		switch (process_stopped(pid))				\
181		case 0:							\
182		case -1: {						\
183			debug(DEBUG_EVENT,				\
184			      "process not stopped, is it terminating?"); \
185			event.type = EVENT_NONE;			\
186			continue_process(event.proc->pid);		\
187			return &event;					\
188		}							\
189		errno = errno_save;					\
190	} while (0)
191
192	event.proc->instruction_pointer = (void *)(uintptr_t)-1;
193
194	/* Check for task termination now, before we have a need to
195	 * call CHECK_PROCESS_TERMINATED later.  That would suppress
196	 * the event that we are processing.  */
197	if (WIFSIGNALED(status)) {
198		event.type = EVENT_EXIT_SIGNAL;
199		event.e_un.signum = WTERMSIG(status);
200		debug(DEBUG_EVENT, "event: EXIT_SIGNAL: pid=%d, signum=%d", pid, event.e_un.signum);
201		return &event;
202	}
203	if (WIFEXITED(status)) {
204		event.type = EVENT_EXIT;
205		event.e_un.ret_val = WEXITSTATUS(status);
206		debug(DEBUG_EVENT, "event: EXIT: pid=%d, status=%d", pid, event.e_un.ret_val);
207		return &event;
208	}
209
210	event.proc->instruction_pointer = get_instruction_pointer(event.proc);
211	if (event.proc->instruction_pointer == (void *)(uintptr_t)-1) {
212		CHECK_PROCESS_TERMINATED;
213		if (errno != 0)
214			perror("get_instruction_pointer");
215	}
216
217	switch (syscall_p(event.proc, status, &tmp)) {
218		case 1:
219			event.type = EVENT_SYSCALL;
220			event.e_un.sysnum = tmp;
221			debug(DEBUG_EVENT, "event: SYSCALL: pid=%d, sysnum=%d", pid, tmp);
222			return &event;
223		case 2:
224			event.type = EVENT_SYSRET;
225			event.e_un.sysnum = tmp;
226			debug(DEBUG_EVENT, "event: SYSRET: pid=%d, sysnum=%d", pid, tmp);
227			return &event;
228		case 3:
229			event.type = EVENT_ARCH_SYSCALL;
230			event.e_un.sysnum = tmp;
231			debug(DEBUG_EVENT, "event: ARCH_SYSCALL: pid=%d, sysnum=%d", pid, tmp);
232			return &event;
233		case 4:
234			event.type = EVENT_ARCH_SYSRET;
235			event.e_un.sysnum = tmp;
236			debug(DEBUG_EVENT, "event: ARCH_SYSRET: pid=%d, sysnum=%d", pid, tmp);
237			return &event;
238		case -1:
239			CHECK_PROCESS_TERMINATED;
240			if (errno != 0)
241				perror("syscall_p");
242	}
243	if (WIFSTOPPED(status)) {
244		int what = status >> 16;
245		if (what == PTRACE_EVENT_VFORK
246		    || what == PTRACE_EVENT_FORK
247		    || what == PTRACE_EVENT_CLONE) {
248			unsigned long data;
249			event.type = what == PTRACE_EVENT_VFORK
250				? EVENT_VFORK : EVENT_CLONE;
251			ptrace(PTRACE_GETEVENTMSG, pid, NULL, &data);
252			event.e_un.newpid = data;
253			debug(DEBUG_EVENT, "event: CLONE: pid=%d, newpid=%d",
254			      pid, (int)data);
255			return &event;
256		}
257	}
258	if (WIFSTOPPED(status) && (status>>16 == PTRACE_EVENT_EXEC)) {
259		event.type = EVENT_EXEC;
260		debug(DEBUG_EVENT, "event: EXEC: pid=%d", pid);
261		return &event;
262	}
263	if (!WIFSTOPPED(status)) {
264		/* should never happen */
265		event.type = EVENT_NONE;
266		debug(DEBUG_EVENT, "event: NONE: pid=%d (wait error?)", pid);
267		return &event;
268	}
269
270	stop_signal = WSTOPSIG(status);
271
272	/* On some targets, breakpoints are signalled not using
273	   SIGTRAP, but also with SIGILL, SIGSEGV or SIGEMT.  SIGEMT
274	   is not defined on Linux, but check for the others.
275
276	   N.B. see comments in GDB's infrun.c for details.  I've
277	   actually seen this on an Itanium machine on RHEL 5, I don't
278	   remember the exact kernel version anymore.  ia64-sigill.s
279	   in the test suite tests this.  Petr Machata 2011-06-08.  */
280	void * break_address
281		= event.proc->instruction_pointer - DECR_PC_AFTER_BREAK;
282	if ((stop_signal == SIGSEGV || stop_signal == SIGILL)
283	    && leader != NULL
284	    && address2bpstruct(leader, break_address))
285			stop_signal = SIGTRAP;
286
287	if (stop_signal != (SIGTRAP | event.proc->tracesysgood)
288			&& stop_signal != SIGTRAP) {
289		event.type = EVENT_SIGNAL;
290		event.e_un.signum = stop_signal;
291		debug(DEBUG_EVENT, "event: SIGNAL: pid=%d, signum=%d", pid, stop_signal);
292		return &event;
293	}
294
295	/* last case [by exhaustion] */
296	event.type = EVENT_BREAKPOINT;
297
298	event.e_un.brk_addr = break_address;
299	debug(DEBUG_EVENT, "event: BREAKPOINT: pid=%d, addr=%p", pid, event.e_un.brk_addr);
300
301	return &event;
302}
303