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