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