Imported Upstream version 0.7.91
[platform/upstream/ltrace.git] / sysdeps / linux-gnu / events.c
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
43 static Event event;
44
45 /* A queue of events that we missed while enabling the
46  * breakpoint in one of tasks.  */
47 static Event * delayed_events = NULL;
48 static Event * end_delayed_events = NULL;
49
50 static enum callback_status
51 first(struct process *proc, void *data)
52 {
53         return CBS_STOP;
54 }
55
56 void
57 enque_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
79 Event *
80 each_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
117 static enum ecb_status
118 event_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
128 static Event *
129 next_qd_event(void)
130 {
131         return each_qd_event(&event_process_not_reenabling, NULL);
132 }
133
134 int linux_in_waitpid = 0;
135
136 Event *
137 next_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
201         get_arch_dep(event.proc);
202         debug(3, "event from pid %u", pid);
203         struct process *leader = event.proc->leader;
204
205         /* The process should be stopped after the waitpid call.  But
206          * when the whole thread group is terminated, we see
207          * individual tasks spontaneously transitioning from 't' to
208          * 'R' and 'Z'.  Calls to ptrace fail and /proc/pid/status may
209          * not even be available anymore, so we can't check in
210          * advance.  So we just drop the error checking around ptrace
211          * calls.  We check for termination ex post when it fails,
212          * suppress the event, and let the event loop collect the
213          * termination in the next iteration.  */
214 #define CHECK_PROCESS_TERMINATED                                        \
215         do {                                                            \
216                 int errno_save = errno;                                 \
217                 switch (process_stopped(pid))                           \
218                 case 0:                                                 \
219                 case -1: {                                              \
220                         debug(DEBUG_EVENT,                              \
221                               "process not stopped, is it terminating?"); \
222                         event.type = EVENT_NONE;                        \
223                         continue_process(event.proc->pid);              \
224                         return &event;                                  \
225                 }                                                       \
226                 errno = errno_save;                                     \
227         } while (0)
228
229         event.proc->instruction_pointer = (void *)(uintptr_t)-1;
230
231         /* Check for task termination now, before we have a need to
232          * call CHECK_PROCESS_TERMINATED later.  That would suppress
233          * the event that we are processing.  */
234         if (WIFSIGNALED(status)) {
235                 event.type = EVENT_EXIT_SIGNAL;
236                 event.e_un.signum = WTERMSIG(status);
237                 debug(DEBUG_EVENT, "event: EXIT_SIGNAL: pid=%d, signum=%d", pid, event.e_un.signum);
238                 return &event;
239         }
240         if (WIFEXITED(status)) {
241                 event.type = EVENT_EXIT;
242                 event.e_un.ret_val = WEXITSTATUS(status);
243                 debug(DEBUG_EVENT, "event: EXIT: pid=%d, status=%d", pid, event.e_un.ret_val);
244                 return &event;
245         }
246
247         event.proc->instruction_pointer = get_instruction_pointer(event.proc);
248         if (event.proc->instruction_pointer == (void *)(uintptr_t)-1) {
249                 CHECK_PROCESS_TERMINATED;
250                 if (errno != 0)
251                         perror("get_instruction_pointer");
252         }
253
254         switch (syscall_p(event.proc, status, &tmp)) {
255                 case 1:
256                         event.type = EVENT_SYSCALL;
257                         event.e_un.sysnum = tmp;
258                         debug(DEBUG_EVENT, "event: SYSCALL: pid=%d, sysnum=%d", pid, tmp);
259                         return &event;
260                 case 2:
261                         event.type = EVENT_SYSRET;
262                         event.e_un.sysnum = tmp;
263                         debug(DEBUG_EVENT, "event: SYSRET: pid=%d, sysnum=%d", pid, tmp);
264                         return &event;
265                 case 3:
266                         event.type = EVENT_ARCH_SYSCALL;
267                         event.e_un.sysnum = tmp;
268                         debug(DEBUG_EVENT, "event: ARCH_SYSCALL: pid=%d, sysnum=%d", pid, tmp);
269                         return &event;
270                 case 4:
271                         event.type = EVENT_ARCH_SYSRET;
272                         event.e_un.sysnum = tmp;
273                         debug(DEBUG_EVENT, "event: ARCH_SYSRET: pid=%d, sysnum=%d", pid, tmp);
274                         return &event;
275                 case -1:
276                         CHECK_PROCESS_TERMINATED;
277                         if (errno != 0)
278                                 perror("syscall_p");
279         }
280         if (WIFSTOPPED(status)) {
281                 int what = status >> 16;
282                 if (what == PTRACE_EVENT_VFORK
283                     || what == PTRACE_EVENT_FORK
284                     || what == PTRACE_EVENT_CLONE) {
285                         unsigned long data;
286                         event.type = what == PTRACE_EVENT_VFORK
287                                 ? EVENT_VFORK : EVENT_CLONE;
288                         ptrace(PTRACE_GETEVENTMSG, pid, NULL, &data);
289                         event.e_un.newpid = data;
290                         debug(DEBUG_EVENT, "event: CLONE: pid=%d, newpid=%d",
291                               pid, (int)data);
292                         return &event;
293                 }
294         }
295         if (WIFSTOPPED(status) && (status>>16 == PTRACE_EVENT_EXEC)) {
296                 event.type = EVENT_EXEC;
297                 debug(DEBUG_EVENT, "event: EXEC: pid=%d", pid);
298                 return &event;
299         }
300         if (!WIFSTOPPED(status)) {
301                 /* should never happen */
302                 event.type = EVENT_NONE;
303                 debug(DEBUG_EVENT, "event: NONE: pid=%d (wait error?)", pid);
304                 return &event;
305         }
306
307         stop_signal = WSTOPSIG(status);
308
309         /* On some targets, breakpoints are signalled not using
310            SIGTRAP, but also with SIGILL, SIGSEGV or SIGEMT.  SIGEMT
311            is not defined on Linux, but check for the others.
312
313            N.B. see comments in GDB's infrun.c for details.  I've
314            actually seen this on an Itanium machine on RHEL 5, I don't
315            remember the exact kernel version anymore.  ia64-sigill.s
316            in the test suite tests this.  Petr Machata 2011-06-08.  */
317         arch_addr_t break_address
318                 = event.proc->instruction_pointer - DECR_PC_AFTER_BREAK;
319         if ((stop_signal == SIGSEGV || stop_signal == SIGILL)
320             && leader != NULL
321             && address2bpstruct(leader, break_address))
322                         stop_signal = SIGTRAP;
323
324         if (stop_signal != (SIGTRAP | event.proc->tracesysgood)
325                         && stop_signal != SIGTRAP) {
326                 event.type = EVENT_SIGNAL;
327                 event.e_un.signum = stop_signal;
328                 debug(DEBUG_EVENT, "event: SIGNAL: pid=%d, signum=%d", pid, stop_signal);
329                 return &event;
330         }
331
332         /* last case [by exhaustion] */
333         event.type = EVENT_BREAKPOINT;
334
335         event.e_un.brk_addr = break_address;
336         debug(DEBUG_EVENT, "event: BREAKPOINT: pid=%d, addr=%p", pid, event.e_un.brk_addr);
337
338         return &event;
339 }
340
341 static enum ecb_status
342 event_for_proc(struct Event *event, void *data)
343 {
344         if (event->proc == data)
345                 return ECB_DEQUE;
346         else
347                 return ECB_CONT;
348 }
349
350 void
351 delete_events_for(struct process *proc)
352 {
353         struct Event *event;
354         while ((event = each_qd_event(&event_for_proc, proc)) != NULL)
355                 free(event);
356 }