1642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata/* 2642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * This file is part of ltrace. 3642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * Copyright (C) 2007,2011,2012 Petr Machata, Red Hat Inc. 4642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * Copyright (C) 1998,2001,2004,2007,2008,2009 Juan Cespedes 5642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * 6642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * This program is free software; you can redistribute it and/or 7642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * modify it under the terms of the GNU General Public License as 8642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * published by the Free Software Foundation; either version 2 of the 9642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * License, or (at your option) any later version. 10642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * 11642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * This program is distributed in the hope that it will be useful, but 12642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * WITHOUT ANY WARRANTY; without even the implied warranty of 13642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * General Public License for more details. 15642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * 16642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * You should have received a copy of the GNU General Public License 17642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * along with this program; if not, write to the Free Software 18642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 19642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata * 02110-1301 USA 20642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata */ 21642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata 22d44c6b8b090b8b7aa9d971d9e0bfd848732a3071Juan Cespedes#include "config.h" 23d44c6b8b090b8b7aa9d971d9e0bfd848732a3071Juan Cespedes 245e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#define _GNU_SOURCE 1 25ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <sys/ptrace.h> 265e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <sys/types.h> 275e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <sys/wait.h> 28ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <assert.h> 295e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <errno.h> 305e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <signal.h> 31ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <stdio.h> 32ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include <stdlib.h> 335e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes#include <string.h> 3497b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata#include <unistd.h> 355e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes 36642626096a694c6af279d25d2b1b2fba5b10ddfbPetr Machata#include "backend.h" 37ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "breakpoint.h" 38ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "debug.h" 39cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata#include "events.h" 40ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata#include "proc.h" 41af766ab1e37231fe1d7dc5e4b598b9c92f78ecd4Petr Machata#include "linux-gnu/trace-defs.h" 425e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes 43393f1d00c582058078cc238547f65202c438fb19Juan Cespedesstatic Event event; 445e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes 4569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata/* A queue of events that we missed while enabling the 4669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata * breakpoint in one of tasks. */ 4769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatastatic Event * delayed_events = NULL; 4869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatastatic Event * end_delayed_events = NULL; 4969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata 502b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machatastatic enum callback_status 51929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatafirst(struct process *proc, void *data) 52cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata{ 532b46cfc1127d390eddd9593fe5ce5399c1f68130Petr Machata return CBS_STOP; 54cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata} 55cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata 5669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatavoid 5769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machataenque_event(Event * event) 5869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata{ 5969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata debug(DEBUG_FUNCTION, "%d: queuing event %d for later", 6069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata event->proc->pid, event->type); 6169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata Event * ne = malloc(sizeof(*ne)); 6269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata if (ne == NULL) { 63ba1664b062414481d0f37d06bb01a19874c8d481Petr Machata fprintf(stderr, "event will be missed: %s\n", strerror(errno)); 6469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata return; 6569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata } 6669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata 6769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata *ne = *event; 6869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata ne->next = NULL; 6969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata if (end_delayed_events == NULL) { 7069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata assert(delayed_events == NULL); 7169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata end_delayed_events = delayed_events = ne; 7269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata } 7369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata else { 7469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata assert(delayed_events != NULL); 7569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata end_delayed_events = end_delayed_events->next = ne; 7669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata } 7769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata} 7869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata 7969a03e6f8c15fb0272089e387a658acad887fb9cPetr MachataEvent * 8069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machataeach_qd_event(enum ecb_status (*pred)(Event *, void *), void * data) 8169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata{ 8269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata Event * prev = delayed_events; 8369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata Event * event; 8469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata for (event = prev; event != NULL; ) { 8569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata switch ((*pred)(event, data)) { 8671f25e25a4081b726e75026727483b6959dd8661Petr Machata case ECB_CONT: 8769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata prev = event; 8869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata event = event->next; 8969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata continue; 9069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata 9171f25e25a4081b726e75026727483b6959dd8661Petr Machata case ECB_DEQUE: 9269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata debug(DEBUG_FUNCTION, "dequeuing event %d for %d", 9369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata event->type, 9469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata event->proc != NULL ? event->proc->pid : -1); 9569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata /* 9669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata printf("dequeuing event %d for %d\n", event->type, 9769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata event->proc != NULL ? event->proc->pid : -1) ; 9869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata */ 9969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata if (end_delayed_events == event) 10069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata end_delayed_events = prev; 10169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata if (delayed_events == event) 10269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata delayed_events = event->next; 10369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata else 10469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata prev->next = event->next; 10569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata if (delayed_events == NULL) 10669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata end_delayed_events = NULL; 10769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata /* fall-through */ 10869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata 10971f25e25a4081b726e75026727483b6959dd8661Petr Machata case ECB_YIELD: 11069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata return event; 11169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata } 11269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata } 11369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata 11469a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata return NULL; 11569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata} 11669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata 11769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatastatic enum ecb_status 11869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machataevent_process_not_reenabling(Event * event, void * data) 11969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata{ 1204007d74c2435ce4b50305d64ffe831627f989335Petr Machata if (event->proc == NULL 1214007d74c2435ce4b50305d64ffe831627f989335Petr Machata || event->proc->leader == NULL 1224007d74c2435ce4b50305d64ffe831627f989335Petr Machata || event->proc->leader->event_handler == NULL) 12371f25e25a4081b726e75026727483b6959dd8661Petr Machata return ECB_DEQUE; 1244007d74c2435ce4b50305d64ffe831627f989335Petr Machata else 12571f25e25a4081b726e75026727483b6959dd8661Petr Machata return ECB_CONT; 12669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata} 12769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata 12869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatastatic Event * 12969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machatanext_qd_event(void) 13069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata{ 13169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata return each_qd_event(&event_process_not_reenabling, NULL); 13269a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata} 13369a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata 134ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machataint linux_in_waitpid = 0; 135ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machata 136393f1d00c582058078cc238547f65202c438fb19Juan CespedesEvent * 1372662768efe599f6bb43c4310177e30f56b601bb7Petr Machatanext_event(void) 1382662768efe599f6bb43c4310177e30f56b601bb7Petr Machata{ 1395e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes pid_t pid; 1405e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes int status; 1415e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes int tmp; 142ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata int stop_signal; 1435e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes 144cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_FUNCTION, "next_event()"); 14569a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata Event * ev; 14669a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata if ((ev = next_qd_event()) != NULL) { 14769a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata event = *ev; 14869a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata free(ev); 14969a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata return &event; 15069a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata } 15169a03e6f8c15fb0272089e387a658acad887fb9cPetr Machata 152cebb88491e68bdf4d466b03970c9ca77f65615f8Petr Machata if (!each_process(NULL, &first, NULL)) { 153cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: No more traced programs: exiting"); 15428f60197b93b45422a73e5d1a6aa581584d6c4a5Juan Cespedes exit(0); 15528f60197b93b45422a73e5d1a6aa581584d6c4a5Juan Cespedes } 156ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machata 157ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machata linux_in_waitpid = 1; 1586be8028492b29f68126ce413b7ef4b875c7bb017Juan Cespedes pid = waitpid(-1, &status, __WALL); 159ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machata linux_in_waitpid = 0; 160ffe4cd25089680daf1bd1ec0114d177ec3e0cf95Petr Machata 1612d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand if (pid == -1) { 1622d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand if (errno == ECHILD) { 163cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: No more traced programs: exiting"); 1645e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes exit(0); 1652d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand } else if (errno == EINTR) { 166cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: none (wait received EINTR?)"); 1678f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes event.type = EVENT_NONE; 16828f60197b93b45422a73e5d1a6aa581584d6c4a5Juan Cespedes return &event; 1695e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes } 1705e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes perror("wait"); 1715e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes exit(1); 1725e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes } 1735e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes event.proc = pid2proc(pid); 1742721e6adbc7399e1b621b896b4f5b864082fbf03Juan Cespedes if (!event.proc || event.proc->state == STATE_BEING_CREATED) { 17597b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata /* Work around (presumably) a bug on some kernels, 17697b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * where we are seeing a waitpid event even though the 17797b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * process is still reported to be running. Wait for 17897b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * the tracing stop to propagate. But don't get stuck 17997b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * here forever. 18097b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * 18197b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * We need the process in T, because there's a lot of 18297b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * ptracing going on all over the place, and these 18397b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * calls fail when the process is not in T. 18497b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * 18597b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * N.B. This was observed on RHEL 5 Itanium, but I'm 18697b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * turning this on globally, to save some poor soul 18797b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * down the road (which could well be me a year from 18897b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * now) the pain of figuring this out all over again. 18997b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata * Petr Machata 2011-11-22. */ 19097b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata int i = 0; 1916dfc544b6aa6703d2292be34470aebf874d78452Petr Machata for (; i < 100 && process_status(pid) != PS_TRACING_STOP; ++i) { 19297b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata debug(2, "waiting for %d to stop", pid); 19397b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata usleep(10000); 19497b208405bcbf2fc75a70fba7d094740f590cb90Petr Machata } 1958f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes event.type = EVENT_NEW; 1962721e6adbc7399e1b621b896b4f5b864082fbf03Juan Cespedes event.e_un.newpid = pid; 197cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: NEW: pid=%d", pid); 198a8909f71e1421949c960f287217be6c42c286c0fJuan Cespedes return &event; 1995e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes } 200ba36f0ac51d194c599fd56457796e33e62c3220bPetr Machata 2015c3fe0697b202cc7d95e90459de0fb312b297b27Juan Cespedes get_arch_dep(event.proc); 2021e583132c95aa211fab9e0e0869b237adfa78304Juan Cespedes debug(3, "event from pid %u", pid); 203929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machata struct process *leader = event.proc->leader; 204f0bd98b3e6753d8609a3054a61f2df6f9cdac10aJoe Damato 205f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata /* The process should be stopped after the waitpid call. But 206f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata * when the whole thread group is terminated, we see 207f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata * individual tasks spontaneously transitioning from 't' to 208f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata * 'R' and 'Z'. Calls to ptrace fail and /proc/pid/status may 209f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata * not even be available anymore, so we can't check in 210f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata * advance. So we just drop the error checking around ptrace 211f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata * calls. We check for termination ex post when it fails, 212f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata * suppress the event, and let the event loop collect the 213f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata * termination in the next iteration. */ 214f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata#define CHECK_PROCESS_TERMINATED \ 215f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata do { \ 216f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata int errno_save = errno; \ 217f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata switch (process_stopped(pid)) \ 218f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata case 0: \ 219f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata case -1: { \ 220f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata debug(DEBUG_EVENT, \ 221f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata "process not stopped, is it terminating?"); \ 222f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata event.type = EVENT_NONE; \ 223f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata continue_process(event.proc->pid); \ 224f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata return &event; \ 225f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata } \ 226f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata errno = errno_save; \ 227f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata } while (0) 228f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata 2299a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata event.proc->instruction_pointer = (void *)(uintptr_t)-1; 2306901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata 231f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata /* Check for task termination now, before we have a need to 232f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata * call CHECK_PROCESS_TERMINATED later. That would suppress 233f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata * the event that we are processing. */ 234f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata if (WIFSIGNALED(status)) { 235f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata event.type = EVENT_EXIT_SIGNAL; 236f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata event.e_un.signum = WTERMSIG(status); 237f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata debug(DEBUG_EVENT, "event: EXIT_SIGNAL: pid=%d, signum=%d", pid, event.e_un.signum); 238f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata return &event; 239f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata } 240f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata if (WIFEXITED(status)) { 241f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata event.type = EVENT_EXIT; 242f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata event.e_un.ret_val = WEXITSTATUS(status); 243f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata debug(DEBUG_EVENT, "event: EXIT: pid=%d, status=%d", pid, event.e_un.ret_val); 244f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata return &event; 245f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata } 246f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata 2476901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata event.proc->instruction_pointer = get_instruction_pointer(event.proc); 2486901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata if (event.proc->instruction_pointer == (void *)(uintptr_t)-1) { 249f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata CHECK_PROCESS_TERMINATED; 2506901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata if (errno != 0) 2516901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata perror("get_instruction_pointer"); 252f0fdae9e2444c2fb7764774088c574ab53c787f4Juan Cespedes } 2536901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata 2542d45b1a8e26a36a9f85dc49e721c4390ca93dc40Ian Wienand switch (syscall_p(event.proc, status, &tmp)) { 25563184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes case 1: 2568f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes event.type = EVENT_SYSCALL; 25763184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes event.e_un.sysnum = tmp; 258cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: SYSCALL: pid=%d, sysnum=%d", pid, tmp); 25963184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes return &event; 26063184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes case 2: 2618f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes event.type = EVENT_SYSRET; 26263184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes event.e_un.sysnum = tmp; 263cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: SYSRET: pid=%d, sysnum=%d", pid, tmp); 26463184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes return &event; 26563184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes case 3: 2668f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes event.type = EVENT_ARCH_SYSCALL; 26763184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes event.e_un.sysnum = tmp; 268cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: ARCH_SYSCALL: pid=%d, sysnum=%d", pid, tmp); 26963184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes return &event; 27063184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes case 4: 2718f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes event.type = EVENT_ARCH_SYSRET; 27263184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes event.e_un.sysnum = tmp; 273cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: ARCH_SYSRET: pid=%d, sysnum=%d", pid, tmp); 27463184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes return &event; 27563184be8c577f5799e44db2a4e312a8240ad7751Juan Cespedes case -1: 276f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata CHECK_PROCESS_TERMINATED; 277f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata if (errno != 0) 278f2d2ba5ce96587f4cc0975441a5da4c6e672e8faPetr Machata perror("syscall_p"); 2795e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes } 280cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata if (WIFSTOPPED(status)) { 281cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata int what = status >> 16; 282cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata if (what == PTRACE_EVENT_VFORK 283cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata || what == PTRACE_EVENT_FORK 284cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata || what == PTRACE_EVENT_CLONE) { 285cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata unsigned long data; 286cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata event.type = what == PTRACE_EVENT_VFORK 287cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata ? EVENT_VFORK : EVENT_CLONE; 288cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata ptrace(PTRACE_GETEVENTMSG, pid, NULL, &data); 289cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata event.e_un.newpid = data; 290cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata debug(DEBUG_EVENT, "event: CLONE: pid=%d, newpid=%d", 291cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata pid, (int)data); 292cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata return &event; 293cbe29c6c0ad01839a81272c4715ea73d17e89611Petr Machata } 2941e583132c95aa211fab9e0e0869b237adfa78304Juan Cespedes } 2951e583132c95aa211fab9e0e0869b237adfa78304Juan Cespedes if (WIFSTOPPED(status) && (status>>16 == PTRACE_EVENT_EXEC)) { 2968f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes event.type = EVENT_EXEC; 297cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: EXEC: pid=%d", pid); 2981e583132c95aa211fab9e0e0869b237adfa78304Juan Cespedes return &event; 2991e583132c95aa211fab9e0e0869b237adfa78304Juan Cespedes } 3005e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes if (!WIFSTOPPED(status)) { 301427b7811598f905b583ac86b35c72228fd415476Juan Cespedes /* should never happen */ 3028f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes event.type = EVENT_NONE; 303cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: NONE: pid=%d (wait error?)", pid); 3045e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes return &event; 3055e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes } 306ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata 307ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata stop_signal = WSTOPSIG(status); 308ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata 309ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata /* On some targets, breakpoints are signalled not using 3106901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata SIGTRAP, but also with SIGILL, SIGSEGV or SIGEMT. SIGEMT 3116901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata is not defined on Linux, but check for the others. 312ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata 3136901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata N.B. see comments in GDB's infrun.c for details. I've 3146901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata actually seen this on an Itanium machine on RHEL 5, I don't 3156901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata remember the exact kernel version anymore. ia64-sigill.s 3166901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata in the test suite tests this. Petr Machata 2011-06-08. */ 317ba36f0ac51d194c599fd56457796e33e62c3220bPetr Machata arch_addr_t break_address 3186901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata = event.proc->instruction_pointer - DECR_PC_AFTER_BREAK; 3196901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata if ((stop_signal == SIGSEGV || stop_signal == SIGILL) 3209a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata && leader != NULL 3219a5420c82a2fd81681572a2e3859ea1671c3bdedPetr Machata && address2bpstruct(leader, break_address)) 322ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata stop_signal = SIGTRAP; 323ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata 324ef46b3e70e54059a7a8bf32af7361bb262ccc8d1Petr Machata if (stop_signal != (SIGTRAP | event.proc->tracesysgood) 325427b7811598f905b583ac86b35c72228fd415476Juan Cespedes && stop_signal != SIGTRAP) { 3268f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes event.type = EVENT_SIGNAL; 327a413e5b8880de643a83ad124d078091c0956fe1dJuan Cespedes event.e_un.signum = stop_signal; 328cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: SIGNAL: pid=%d, signum=%d", pid, stop_signal); 3295e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes return &event; 3305e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes } 33155ed83b24df9c6d671091a8c75caab33ffecd40ePetr Machata 332427b7811598f905b583ac86b35c72228fd415476Juan Cespedes /* last case [by exhaustion] */ 3338f6d1ecd5f4301f899927a553572c5089fd29bcfJuan Cespedes event.type = EVENT_BREAKPOINT; 334427b7811598f905b583ac86b35c72228fd415476Juan Cespedes 3356901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata event.e_un.brk_addr = break_address; 336cd8976dbee947f152c3a322503a1063c6359da76Juan Cespedes debug(DEBUG_EVENT, "event: BREAKPOINT: pid=%d, addr=%p", pid, event.e_un.brk_addr); 3376901b7e429f7e92440f3501df864ad74b39f66c2Petr Machata 3385e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes return &event; 3395e01f654d83a95f2acffa86df57a4c2db9b0cae9Juan Cespedes} 340cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata 341cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machatastatic enum ecb_status 342cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machataevent_for_proc(struct Event *event, void *data) 343cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata{ 344cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata if (event->proc == data) 34571f25e25a4081b726e75026727483b6959dd8661Petr Machata return ECB_DEQUE; 346cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata else 34771f25e25a4081b726e75026727483b6959dd8661Petr Machata return ECB_CONT; 348cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata} 349cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata 350cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machatavoid 351929bd57ca202fd2f2e8485ebf65d683e664f67b5Petr Machatadelete_events_for(struct process *proc) 352cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata{ 353cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata struct Event *event; 354cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata while ((event = each_qd_event(&event_for_proc, proc)) != NULL) 355cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata free(event); 356cd972587a4c0d14d764b3d0a43d75f5941db14ccPetr Machata} 357