events.c revision 71f25e25a4081b726e75026727483b6959dd8661
1/*
2 * This file is part of ltrace.
3 * Copyright (C) 2007,2011,2012 Petr Machata, Red Hat Inc.
4 * Copyright (C) 1998,2001,2004,2007,2008,2009 Juan Cespedes
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; either version 2 of the
9 * License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
19 * 02110-1301 USA
20 */
21
22#include "config.h"
23
24#define	_GNU_SOURCE	1
25#include <sys/ptrace.h>
26#include <sys/types.h>
27#include <sys/wait.h>
28#include <assert.h>
29#include <errno.h>
30#include <signal.h>
31#include <stdio.h>
32#include <stdlib.h>
33#include <string.h>
34#include <unistd.h>
35
36#include "backend.h"
37#include "breakpoint.h"
38#include "debug.h"
39#include "events.h"
40#include "proc.h"
41#include "linux-gnu/trace-defs.h"
42
43static Event event;
44
45/* A queue of events that we missed while enabling the
46 * breakpoint in one of tasks.  */
47static Event * delayed_events = NULL;
48static Event * end_delayed_events = NULL;
49
50static enum callback_status
51first(struct process *proc, void *data)
52{
53	return CBS_STOP;
54}
55
56void
57enque_event(Event * event)
58{
59	debug(DEBUG_FUNCTION, "%d: queuing event %d for later",
60	      event->proc->pid, event->type);
61	Event * ne = malloc(sizeof(*ne));
62	if (ne == NULL) {
63		fprintf(stderr, "event will be missed: %s\n", strerror(errno));
64		return;
65	}
66
67	*ne = *event;
68	ne->next = NULL;
69	if (end_delayed_events == NULL) {
70		assert(delayed_events == NULL);
71		end_delayed_events = delayed_events = ne;
72	}
73	else {
74		assert(delayed_events != NULL);
75		end_delayed_events = end_delayed_events->next = ne;
76	}
77}
78
79Event *
80each_qd_event(enum ecb_status (*pred)(Event *, void *), void * data)
81{
82	Event * prev = delayed_events;
83	Event * event;
84	for (event = prev; event != NULL; ) {
85		switch ((*pred)(event, data)) {
86		case ECB_CONT:
87			prev = event;
88			event = event->next;
89			continue;
90
91		case ECB_DEQUE:
92			debug(DEBUG_FUNCTION, "dequeuing event %d for %d",
93			      event->type,
94			      event->proc != NULL ? event->proc->pid : -1);
95			/*
96			printf("dequeuing event %d for %d\n", event->type,
97			       event->proc != NULL ? event->proc->pid : -1) ;
98			*/
99			if (end_delayed_events == event)
100				end_delayed_events = prev;
101			if (delayed_events == event)
102				delayed_events = event->next;
103			else
104				prev->next = event->next;
105			if (delayed_events == NULL)
106				end_delayed_events = NULL;
107			/* fall-through */
108
109		case ECB_YIELD:
110			return event;
111		}
112	}
113
114	return NULL;
115}
116
117static enum ecb_status
118event_process_not_reenabling(Event * event, void * data)
119{
120	if (event->proc == NULL
121	    || event->proc->leader == NULL
122	    || event->proc->leader->event_handler == NULL)
123		return ECB_DEQUE;
124	else
125		return ECB_CONT;
126}
127
128static Event *
129next_qd_event(void)
130{
131	return each_qd_event(&event_process_not_reenabling, NULL);
132}
133
134int linux_in_waitpid = 0;
135
136Event *
137next_event(void)
138{
139	pid_t pid;
140	int status;
141	int tmp;
142	int stop_signal;
143
144	debug(DEBUG_FUNCTION, "next_event()");
145	Event * ev;
146	if ((ev = next_qd_event()) != NULL) {
147		event = *ev;
148		free(ev);
149		return &event;
150	}
151
152	if (!each_process(NULL, &first, NULL)) {
153		debug(DEBUG_EVENT, "event: No more traced programs: exiting");
154		exit(0);
155	}
156
157	linux_in_waitpid = 1;
158	pid = waitpid(-1, &status, __WALL);
159	linux_in_waitpid = 0;
160
161	if (pid == -1) {
162		if (errno == ECHILD) {
163			debug(DEBUG_EVENT, "event: No more traced programs: exiting");
164			exit(0);
165		} else if (errno == EINTR) {
166			debug(DEBUG_EVENT, "event: none (wait received EINTR?)");
167			event.type = EVENT_NONE;
168			return &event;
169		}
170		perror("wait");
171		exit(1);
172	}
173	event.proc = pid2proc(pid);
174	if (!event.proc || event.proc->state == STATE_BEING_CREATED) {
175		/* Work around (presumably) a bug on some kernels,
176		 * where we are seeing a waitpid event even though the
177		 * process is still reported to be running.  Wait for
178		 * the tracing stop to propagate.  But don't get stuck
179		 * here forever.
180		 *
181		 * We need the process in T, because there's a lot of
182		 * ptracing going on all over the place, and these
183		 * calls fail when the process is not in T.
184		 *
185		 * N.B. This was observed on RHEL 5 Itanium, but I'm
186		 * turning this on globally, to save some poor soul
187		 * down the road (which could well be me a year from
188		 * now) the pain of figuring this out all over again.
189		 * Petr Machata 2011-11-22.  */
190		int i = 0;
191		for (; i < 100 && process_status(pid) != PS_TRACING_STOP; ++i) {
192			debug(2, "waiting for %d to stop", pid);
193			usleep(10000);
194		}
195		event.type = EVENT_NEW;
196		event.e_un.newpid = pid;
197		debug(DEBUG_EVENT, "event: NEW: pid=%d", pid);
198		return &event;
199	}
200	get_arch_dep(event.proc);
201	debug(3, "event from pid %u", pid);
202	struct process *leader = event.proc->leader;
203
204	/* The process should be stopped after the waitpid call.  But
205	 * when the whole thread group is terminated, we see
206	 * individual tasks spontaneously transitioning from 't' to
207	 * 'R' and 'Z'.  Calls to ptrace fail and /proc/pid/status may
208	 * not even be available anymore, so we can't check in
209	 * advance.  So we just drop the error checking around ptrace
210	 * calls.  We check for termination ex post when it fails,
211	 * suppress the event, and let the event loop collect the
212	 * termination in the next iteration.  */
213#define CHECK_PROCESS_TERMINATED					\
214	do {								\
215		int errno_save = errno;					\
216		switch (process_stopped(pid))				\
217		case 0:							\
218		case -1: {						\
219			debug(DEBUG_EVENT,				\
220			      "process not stopped, is it terminating?"); \
221			event.type = EVENT_NONE;			\
222			continue_process(event.proc->pid);		\
223			return &event;					\
224		}							\
225		errno = errno_save;					\
226	} while (0)
227
228	event.proc->instruction_pointer = (void *)(uintptr_t)-1;
229
230	/* Check for task termination now, before we have a need to
231	 * call CHECK_PROCESS_TERMINATED later.  That would suppress
232	 * the event that we are processing.  */
233	if (WIFSIGNALED(status)) {
234		event.type = EVENT_EXIT_SIGNAL;
235		event.e_un.signum = WTERMSIG(status);
236		debug(DEBUG_EVENT, "event: EXIT_SIGNAL: pid=%d, signum=%d", pid, event.e_un.signum);
237		return &event;
238	}
239	if (WIFEXITED(status)) {
240		event.type = EVENT_EXIT;
241		event.e_un.ret_val = WEXITSTATUS(status);
242		debug(DEBUG_EVENT, "event: EXIT: pid=%d, status=%d", pid, event.e_un.ret_val);
243		return &event;
244	}
245
246	event.proc->instruction_pointer = get_instruction_pointer(event.proc);
247	if (event.proc->instruction_pointer == (void *)(uintptr_t)-1) {
248		CHECK_PROCESS_TERMINATED;
249		if (errno != 0)
250			perror("get_instruction_pointer");
251	}
252
253	switch (syscall_p(event.proc, status, &tmp)) {
254		case 1:
255			event.type = EVENT_SYSCALL;
256			event.e_un.sysnum = tmp;
257			debug(DEBUG_EVENT, "event: SYSCALL: pid=%d, sysnum=%d", pid, tmp);
258			return &event;
259		case 2:
260			event.type = EVENT_SYSRET;
261			event.e_un.sysnum = tmp;
262			debug(DEBUG_EVENT, "event: SYSRET: pid=%d, sysnum=%d", pid, tmp);
263			return &event;
264		case 3:
265			event.type = EVENT_ARCH_SYSCALL;
266			event.e_un.sysnum = tmp;
267			debug(DEBUG_EVENT, "event: ARCH_SYSCALL: pid=%d, sysnum=%d", pid, tmp);
268			return &event;
269		case 4:
270			event.type = EVENT_ARCH_SYSRET;
271			event.e_un.sysnum = tmp;
272			debug(DEBUG_EVENT, "event: ARCH_SYSRET: pid=%d, sysnum=%d", pid, tmp);
273			return &event;
274		case -1:
275			CHECK_PROCESS_TERMINATED;
276			if (errno != 0)
277				perror("syscall_p");
278	}
279	if (WIFSTOPPED(status)) {
280		int what = status >> 16;
281		if (what == PTRACE_EVENT_VFORK
282		    || what == PTRACE_EVENT_FORK
283		    || what == PTRACE_EVENT_CLONE) {
284			unsigned long data;
285			event.type = what == PTRACE_EVENT_VFORK
286				? EVENT_VFORK : EVENT_CLONE;
287			ptrace(PTRACE_GETEVENTMSG, pid, NULL, &data);
288			event.e_un.newpid = data;
289			debug(DEBUG_EVENT, "event: CLONE: pid=%d, newpid=%d",
290			      pid, (int)data);
291			return &event;
292		}
293	}
294	if (WIFSTOPPED(status) && (status>>16 == PTRACE_EVENT_EXEC)) {
295		event.type = EVENT_EXEC;
296		debug(DEBUG_EVENT, "event: EXEC: pid=%d", pid);
297		return &event;
298	}
299	if (!WIFSTOPPED(status)) {
300		/* should never happen */
301		event.type = EVENT_NONE;
302		debug(DEBUG_EVENT, "event: NONE: pid=%d (wait error?)", pid);
303		return &event;
304	}
305
306	stop_signal = WSTOPSIG(status);
307
308	/* On some targets, breakpoints are signalled not using
309	   SIGTRAP, but also with SIGILL, SIGSEGV or SIGEMT.  SIGEMT
310	   is not defined on Linux, but check for the others.
311
312	   N.B. see comments in GDB's infrun.c for details.  I've
313	   actually seen this on an Itanium machine on RHEL 5, I don't
314	   remember the exact kernel version anymore.  ia64-sigill.s
315	   in the test suite tests this.  Petr Machata 2011-06-08.  */
316	void * break_address
317		= event.proc->instruction_pointer - DECR_PC_AFTER_BREAK;
318	if ((stop_signal == SIGSEGV || stop_signal == SIGILL)
319	    && leader != NULL
320	    && address2bpstruct(leader, break_address))
321			stop_signal = SIGTRAP;
322
323	if (stop_signal != (SIGTRAP | event.proc->tracesysgood)
324			&& stop_signal != SIGTRAP) {
325		event.type = EVENT_SIGNAL;
326		event.e_un.signum = stop_signal;
327		debug(DEBUG_EVENT, "event: SIGNAL: pid=%d, signum=%d", pid, stop_signal);
328		return &event;
329	}
330
331	/* last case [by exhaustion] */
332	event.type = EVENT_BREAKPOINT;
333
334	event.e_un.brk_addr = break_address;
335	debug(DEBUG_EVENT, "event: BREAKPOINT: pid=%d, addr=%p", pid, event.e_un.brk_addr);
336
337	return &event;
338}
339
340static enum ecb_status
341event_for_proc(struct Event *event, void *data)
342{
343	if (event->proc == data)
344		return ECB_DEQUE;
345	else
346		return ECB_CONT;
347}
348
349void
350delete_events_for(struct process *proc)
351{
352	struct Event *event;
353	while ((event = each_qd_event(&event_for_proc, proc)) != NULL)
354		free(event);
355}
356