Home | History | Annotate | Download | only in coregrind
      1 /*--------------------------------------------------------------------*/
      2 /*--- Relay between gdb and gdbserver embedded in valgrind  vgdb.c ---*/
      3 /*--------------------------------------------------------------------*/
      4 
      5 /*
      6    This file is part of Valgrind, a dynamic binary instrumentation
      7    framework.
      8 
      9    Copyright (C) 2011-2011 Philippe Waroquiers
     10 
     11    This program is free software; you can redistribute it and/or
     12    modify it under the terms of the GNU General Public License as
     13    published by the Free Software Foundation; either version 2 of the
     14    License, or (at your option) any later version.
     15 
     16    This program is distributed in the hope that it will be useful, but
     17    WITHOUT ANY WARRANTY; without even the implied warranty of
     18    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     19    General Public License for more details.
     20 
     21    You should have received a copy of the GNU General Public License
     22    along with this program; if not, write to the Free Software
     23    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     24    02111-1307, USA.
     25 
     26    The GNU General Public License is contained in the file COPYING.
     27 */
     28 
     29 #include "pub_core_basics.h"
     30 #include "pub_core_vki.h"
     31 #include "pub_core_libcsetjmp.h"
     32 #include "pub_core_threadstate.h"
     33 #include "pub_core_gdbserver.h"
     34 #include "config.h"
     35 
     36 #include <limits.h>
     37 #include <unistd.h>
     38 #include <string.h>
     39 #include <poll.h>
     40 #include <pthread.h>
     41 #include <stdlib.h>
     42 #include <stdio.h>
     43 #include <fcntl.h>
     44 #include <dirent.h>
     45 #include <sys/stat.h>
     46 #include <sys/time.h>
     47 #include <errno.h>
     48 #include <signal.h>
     49 #include <sys/types.h>
     50 #include <sys/socket.h>
     51 #include <netinet/in.h>
     52 #include <arpa/inet.h>
     53 #include <sys/mman.h>
     54 #include <sys/ptrace.h>
     55 #include <sys/wait.h>
     56 #include <assert.h>
     57 /* vgdb has two usages:
     58    1. relay application between gdb and the gdbserver embedded in valgrind.
     59    2. standalone to send monitor commands to a running valgrind-ified process
     60 
     61    It is made of a main program which reads arguments.  If no
     62    arguments are given or only --pid and --vgdb-prefix, then usage 1 is
     63    assumed.
     64 
     65    As relay application, vgdb reads bytes from gdb on stdin and
     66    writes these bytes to valgrind.  Bytes read from valgrind are
     67    written to gdb on stdout.  Read/Write from/to valgrind is done
     68    using FIFOs.  There is one thread reading from stdin, writing to
     69    valgrind on a FIFO.  There is one thread reading from valgrind on a
     70    FIFO, writing to gdb on stdout
     71 
     72    As a standalone utility, vgdb builds command packets to write to valgrind,
     73    sends it and reads the reply. The same two threads are used to write/read.
     74    Once all the commands are sent and their replies received, vgdb will exit.
     75 
     76 */
     77 
     78 /* define PTRACEINVOKER to compile the ptrace related code
     79    which ensures a valgrind process blocked in a system call
     80    can be "waken up". PTRACEINVOKER implies some architecture
     81    specific code and/or some OS specific code. */
     82 #if defined(VGA_arm) || defined(VGA_x86) || defined(VGA_amd64) \
     83     || defined(VGA_ppc32) || defined(VGA_ppc64) || defined(VGA_s390x)
     84 #define PTRACEINVOKER
     85 #else
     86 I_die_here : (PTRACEINVOKER) architecture missing in vgdb.c
     87 #endif
     88 
     89 /* Some darwin specific stuff is needed as ptrace is not
     90    fully supported on MacOS. Till we find someone courageous
     91    having access to Darwin, there is no PTRACEINVOKER. */
     92 #if defined(VGO_darwin)
     93 #undef PTRACEINVOKER
     94 #endif
     95 
     96 #if defined(VGPV_arm_linux_android) || defined(VGPV_x86_linux_android)
     97 #undef PTRACEINVOKER
     98 #endif
     99 
    100 #if defined(PTRACEINVOKER)
    101 #include <sys/user.h>
    102 #if defined(VGO_linux)
    103 #  include <sys/prctl.h>
    104 #  include <linux/ptrace.h>
    105 #endif
    106 #endif
    107 
    108 
    109 // Outputs information for the user about ptrace_scope protection
    110 // or ptrace not working.
    111 static void ptrace_restrictions_msg(void);
    112 
    113 static int debuglevel;
    114 static struct timeval dbgtv;
    115 /* if level <= debuglevel, print timestamp, then print provided by debug info */
    116 #define DEBUG(level, ...) (level <= debuglevel ?                        \
    117                            gettimeofday(&dbgtv, NULL),                  \
    118                            fprintf(stderr, "%ld.%6.6ld ",               \
    119                                    (long int)dbgtv.tv_sec,              \
    120                                    (long int)dbgtv.tv_usec),            \
    121                            fprintf(stderr, __VA_ARGS__),fflush(stderr)  \
    122                            : 0)
    123 
    124 /* same as DEBUG but does not print time stamp info */
    125 #define PDEBUG(level, ...) (level <= debuglevel ?                       \
    126                             fprintf(stderr, __VA_ARGS__),fflush(stderr) \
    127                             : 0)
    128 
    129 /* if errno != 0,
    130    report the errno and fprintf the ... varargs on stderr. */
    131 #define ERROR(errno, ...) ((errno == 0 ? 0 : perror("syscall failed")), \
    132                            fprintf(stderr, __VA_ARGS__),                \
    133                            fflush(stderr))
    134 /* same as ERROR, but also exits with status 1 */
    135 #define XERROR(errno, ...) ((errno == 0 ? 0 : perror("syscall failed")), \
    136                             fprintf(stderr, __VA_ARGS__),                \
    137                             fflush(stderr),                              \
    138                             exit(1))
    139 
    140 static char *vgdb_prefix = NULL;
    141 
    142 /* Will be set to True when any condition indicating we have to shutdown
    143    is encountered. */
    144 static Bool shutting_down = False;
    145 
    146 static VgdbShared32 *shared32;
    147 static VgdbShared64 *shared64;
    148 #define VS_written_by_vgdb (shared32 != NULL ?        \
    149                             shared32->written_by_vgdb \
    150                             : shared64->written_by_vgdb)
    151 #define VS_seen_by_valgrind (shared32 != NULL ?         \
    152                              shared32->seen_by_valgrind \
    153                              : shared64->seen_by_valgrind)
    154 
    155 #define VS_vgdb_pid (shared32 != NULL ? shared32->vgdb_pid : shared64->vgdb_pid)
    156 
    157 /* Calls malloc (size). Exits if memory can't be allocated. */
    158 static
    159 void *vmalloc(size_t size)
    160 {
    161    void * mem = malloc(size);
    162    if (mem == NULL)
    163       XERROR (errno, "can't allocate memory\n");
    164    return mem;
    165 }
    166 
    167 /* Calls realloc (size). Exits if memory can't be allocated. */
    168 static
    169 void *vrealloc(void *ptr,size_t size)
    170 {
    171    void * mem = realloc(ptr, size);
    172    if (mem == NULL)
    173       XERROR (errno, "can't reallocate memory\n");
    174    return mem;
    175 }
    176 
    177 /* Return the name of a directory for temporary files. */
    178 static
    179 const char *vgdb_tmpdir(void)
    180 {
    181    const char *tmpdir;
    182 
    183    tmpdir = getenv("TMPDIR");
    184    if (tmpdir == NULL || *tmpdir == '\0') tmpdir = VG_TMPDIR;
    185    if (tmpdir == NULL || *tmpdir == '\0') tmpdir = "/tmp";    /* fallback */
    186 
    187    return tmpdir;
    188 }
    189 
    190 /* Return the path prefix for the named pipes (FIFOs) used by vgdb/gdb
    191    to communicate with valgrind */
    192 static
    193 char *vgdb_prefix_default(void)
    194 {
    195    const char *tmpdir;
    196    HChar *prefix;
    197 
    198    tmpdir = vgdb_tmpdir();
    199    prefix = vmalloc(strlen(tmpdir) + strlen("/vgdb-pipe") + 1);
    200    strcpy(prefix, tmpdir);
    201    strcat(prefix, "/vgdb-pipe");
    202 
    203    return prefix;
    204 }
    205 
    206 /* add nrw to the written_by_vgdb field of shared32 or shared64 */
    207 static
    208 void add_written(int nrw)
    209 {
    210    if (shared32 != NULL)
    211       shared32->written_by_vgdb += nrw;
    212    else if (shared64 != NULL)
    213       shared64->written_by_vgdb += nrw;
    214    else
    215       assert(0);
    216 }
    217 
    218 static int shared_mem_fd = -1;
    219 static
    220 void map_vgdbshared (char* shared_mem)
    221 {
    222    struct stat fdstat;
    223    void **s;
    224    shared_mem_fd = open(shared_mem, O_RDWR);
    225    /* shared_mem_fd will not be closed till vgdb exits. */
    226 
    227    if (shared_mem_fd == -1)
    228       XERROR (errno, "error opening %s shared memory file\n", shared_mem);
    229 
    230    if (fstat(shared_mem_fd, &fdstat) != 0)
    231       XERROR (errno, "fstat");
    232 
    233    if (fdstat.st_size == sizeof(VgdbShared64))
    234       s = (void*) &shared64;
    235    else if (fdstat.st_size == sizeof(VgdbShared32))
    236       s = (void*) &shared32;
    237    else
    238 #if VEX_HOST_WORDSIZE == 8
    239       XERROR (0,
    240               "error size shared memory file %s.\n"
    241               "expecting size %d (64bits) or %d (32bits) got %ld.\n",
    242               shared_mem,
    243               (int) sizeof(VgdbShared64), (int) sizeof(VgdbShared32),
    244               (long int)fdstat.st_size);
    245 #elif VEX_HOST_WORDSIZE == 4
    246       XERROR (0,
    247               "error size shared memory file %s.\n"
    248               "expecting size %d (32bits) got %ld.\n",
    249               shared_mem,
    250               (int) sizeof(VgdbShared32),
    251               fdstat.st_size);
    252 #else
    253 # error "unexpected wordsize"
    254 #endif
    255 
    256 #if VEX_HOST_WORDSIZE == 4
    257    if (shared64 != NULL)
    258       XERROR (0, "cannot use 32 bits vgdb with a 64bits valgrind process\n");
    259    /* But we can use a 64 bits vgdb with a 32 bits valgrind */
    260 #endif
    261 
    262    *s = (void*) mmap (NULL, fdstat.st_size,
    263                       PROT_READ|PROT_WRITE, MAP_SHARED,
    264                       shared_mem_fd, 0);
    265 
    266    if (*s == (void *) -1)
    267       XERROR (errno, "error mmap shared memory file %s\n", shared_mem);
    268 
    269 }
    270 
    271 #if VEX_HOST_WORDSIZE == 8
    272 typedef Addr64 CORE_ADDR;
    273 typedef Addr64 PTRACE_XFER_TYPE;
    274 typedef void* PTRACE_ARG3_TYPE;
    275 #elif VEX_HOST_WORDSIZE == 4
    276 typedef Addr32 CORE_ADDR;
    277 typedef Addr32 PTRACE_XFER_TYPE;
    278 typedef void* PTRACE_ARG3_TYPE;
    279 #else
    280 # error "unexpected wordsize"
    281 #endif
    282 
    283 static Bool pid_of_save_regs_continued = False;
    284 // True if we have continued pid_of_save_regs after PTRACE_ATTACH
    285 
    286 static Bool dying = False;
    287 // Set to True when loss of connection indicating that the Valgrind
    288 // process is dying.
    289 
    290 /* To be called when connection with valgrind is lost.  In case we
    291 have lost the connection, it means that Valgrind has closed the
    292 connection and is busy exiting. We can't and don't have to stop it in
    293 this case. */
    294 static
    295 void valgrind_dying(void)
    296 {
    297    pid_of_save_regs_continued = False;
    298    dying = True;
    299 }
    300 
    301 
    302 #ifdef PTRACEINVOKER
    303 /* ptrace_(read|write)_memory are modified extracts of linux-low.c
    304    from gdb 6.6. Copyrighted FSF */
    305 /* Copy LEN bytes from inferior's memory starting at MEMADDR
    306    to debugger memory starting at MYADDR.  */
    307 
    308 static
    309 int ptrace_read_memory (pid_t inferior_pid, CORE_ADDR memaddr,
    310                         unsigned char *myaddr, int len)
    311 {
    312    register int i;
    313    /* Round starting address down to longword boundary.  */
    314    register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);
    315    /* Round ending address up; get number of longwords that makes.  */
    316    register int count
    317       = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
    318       / sizeof (PTRACE_XFER_TYPE);
    319    /* Allocate buffer of that many longwords.  */
    320    register PTRACE_XFER_TYPE *buffer
    321       = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
    322 
    323    /* Read all the longwords */
    324    for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE)) {
    325       errno = 0;
    326       buffer[i] = ptrace (PTRACE_PEEKTEXT, inferior_pid,
    327                           (PTRACE_ARG3_TYPE) addr, 0);
    328       if (errno)
    329          return errno;
    330    }
    331 
    332    /* Copy appropriate bytes out of the buffer.  */
    333    memcpy (myaddr,
    334            (char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)), len);
    335 
    336    return 0;
    337 }
    338 
    339 /* Copy LEN bytes of data from debugger memory at MYADDR
    340    to inferior's memory at MEMADDR.
    341    On failure (cannot write the inferior)
    342    returns the value of errno.  */
    343 
    344 static
    345 int ptrace_write_memory (pid_t inferior_pid, CORE_ADDR memaddr,
    346                          const unsigned char *myaddr, int len)
    347 {
    348    register int i;
    349    /* Round starting address down to longword boundary.  */
    350    register CORE_ADDR addr = memaddr & -(CORE_ADDR) sizeof (PTRACE_XFER_TYPE);
    351    /* Round ending address up; get number of longwords that makes.  */
    352    register int count
    353       = (((memaddr + len) - addr) + sizeof (PTRACE_XFER_TYPE) - 1)
    354       / sizeof (PTRACE_XFER_TYPE);
    355    /* Allocate buffer of that many longwords.  */
    356    register PTRACE_XFER_TYPE *buffer
    357       = (PTRACE_XFER_TYPE *) alloca (count * sizeof (PTRACE_XFER_TYPE));
    358 
    359    if (debuglevel >= 1) {
    360       DEBUG (1, "Writing ");
    361       for (i = 0; i < len; i++)
    362          PDEBUG (1, "%02x", (unsigned)myaddr[i]);
    363       PDEBUG(1, " to %p\n", (void *) memaddr);
    364    }
    365 
    366    /* Fill start and end extra bytes of buffer with existing memory data.  */
    367 
    368    buffer[0] = ptrace (PTRACE_PEEKTEXT, inferior_pid,
    369                        (PTRACE_ARG3_TYPE) addr, 0);
    370 
    371    if (count > 1) {
    372       buffer[count - 1]
    373          = ptrace (PTRACE_PEEKTEXT, inferior_pid,
    374                    (PTRACE_ARG3_TYPE) (addr + (count - 1)
    375                                        * sizeof (PTRACE_XFER_TYPE)),
    376                    0);
    377    }
    378 
    379    /* Copy data to be written over corresponding part of buffer */
    380 
    381    memcpy ((char *) buffer + (memaddr & (sizeof (PTRACE_XFER_TYPE) - 1)),
    382            myaddr, len);
    383 
    384    /* Write the entire buffer.  */
    385 
    386    for (i = 0; i < count; i++, addr += sizeof (PTRACE_XFER_TYPE)) {
    387       errno = 0;
    388       ptrace (PTRACE_POKETEXT, inferior_pid,
    389               (PTRACE_ARG3_TYPE) addr, buffer[i]);
    390       if (errno)
    391          return errno;
    392    }
    393 
    394    return 0;
    395 }
    396 
    397 /* subset of VG_(threads) needed for vgdb ptrace.
    398    This is initialized when process is attached. */
    399 typedef struct {
    400    ThreadStatus status;
    401    Int lwpid;
    402 }
    403 VgdbThreadState;
    404 static VgdbThreadState vgdb_threads[VG_N_THREADS];
    405 
    406 static const
    407 HChar* name_of_ThreadStatus ( ThreadStatus status )
    408 {
    409    switch (status) {
    410    case VgTs_Empty:     return "VgTs_Empty";
    411    case VgTs_Init:      return "VgTs_Init";
    412    case VgTs_Runnable:  return "VgTs_Runnable";
    413    case VgTs_WaitSys:   return "VgTs_WaitSys";
    414    case VgTs_Yielding:  return "VgTs_Yielding";
    415    case VgTs_Zombie:    return "VgTs_Zombie";
    416    default:             return "VgTs_???";
    417   }
    418 }
    419 
    420 static
    421 char *status_image (int status)
    422 {
    423    static char result[256];
    424    int sz = 0;
    425 #define APPEND(...) sz += snprintf (result+sz, 256 - sz - 1, __VA_ARGS__)
    426 
    427    result[0] = 0;
    428 
    429    if (WIFEXITED(status))
    430       APPEND ("WIFEXITED %d ", WEXITSTATUS(status));
    431 
    432    if (WIFSIGNALED(status)) {
    433       APPEND ("WIFSIGNALED %d ", WTERMSIG(status));
    434       if (WCOREDUMP(status)) APPEND ("WCOREDUMP ");
    435    }
    436 
    437    if (WIFSTOPPED(status))
    438       APPEND ("WIFSTOPPED %d ", WSTOPSIG(status));
    439 
    440    if (WIFCONTINUED(status))
    441       APPEND ("WIFCONTINUED ");
    442 
    443    return result;
    444 #undef APPEND
    445 }
    446 
    447 /* Wait till the process pid is reported as stopped with signal_expected.
    448    If other signal(s) than signal_expected are received, waitstopped
    449    will pass them to pid, waiting for signal_expected to stop pid.
    450    Returns True when process is in stopped state with signal_expected.
    451    Returns False if a problem was encountered while waiting for pid
    452    to be stopped.
    453 
    454    If pid is reported as being dead/exited, waitstopped will return False.
    455 */
    456 static
    457 Bool waitstopped (int pid, int signal_expected, char *msg)
    458 {
    459    pid_t p;
    460    int status = 0;
    461    int signal_received;
    462    int res;
    463 
    464    while (1) {
    465       DEBUG(1, "waitstopped %s before waitpid signal_expected %d\n",
    466             msg, signal_expected);
    467       p = waitpid(pid, &status, __WALL);
    468       DEBUG(1, "after waitpid pid %d p %d status 0x%x %s\n", pid, p,
    469             status, status_image (status));
    470       if (p != pid) {
    471          ERROR(errno, "%s waitpid pid %d in waitstopped %d status 0x%x %s\n",
    472                msg, pid, p, status, status_image (status));
    473          return False;
    474       }
    475 
    476       if (WIFEXITED(status)) {
    477          shutting_down = True;
    478          return False;
    479       }
    480 
    481       assert (WIFSTOPPED(status));
    482       signal_received = WSTOPSIG(status);
    483       if (signal_received == signal_expected)
    484          break;
    485 
    486       /* pid received a signal which is not the signal we are waiting for.
    487          We continue pid, transmitting this signal. */
    488       DEBUG(1, "waitstopped PTRACE_CONT with signal %d\n", signal_received);
    489       res = ptrace (PTRACE_CONT, pid, NULL, signal_received);
    490       if (res != 0) {
    491          ERROR(errno, "waitstopped PTRACE_CONT\n");
    492          return False;
    493       }
    494    }
    495 
    496    return True;
    497 }
    498 
    499 /* Stops the given pid, wait for the process to be stopped.
    500    Returns True if succesful, False otherwise.
    501    msg is used in tracing and error reporting. */
    502 static
    503 Bool stop (int pid, char *msg)
    504 {
    505    long res;
    506 
    507    DEBUG(1, "%s SIGSTOP pid %d\n", msg, pid);
    508    res = kill (pid, SIGSTOP);
    509    if (res != 0) {
    510       ERROR(errno, "%s SIGSTOP pid %d %ld\n", msg, pid, res);
    511       return False;
    512    }
    513 
    514    return waitstopped (pid, SIGSTOP, msg);
    515 
    516 }
    517 
    518 /* Attaches to given pid, wait for the process to be stopped.
    519    Returns True if succesful, False otherwise.
    520    msg is used in tracing and error reporting. */
    521 static
    522 Bool attach (int pid, char *msg)
    523 {
    524    long res;
    525    static Bool output_error = True;
    526    static Bool initial_attach = True;
    527    // For a ptrace_scope protected system, we do not want to output
    528    // repetitively attach error. We will output once an error
    529    // for the initial_attach. Once the 1st attach has succeeded, we
    530    // again show all errors.
    531 
    532    DEBUG(1, "%s PTRACE_ATTACH pid %d\n", msg, pid);
    533    res = ptrace (PTRACE_ATTACH, pid, NULL, NULL);
    534    if (res != 0) {
    535       if (output_error || debuglevel > 0) {
    536          ERROR(errno, "%s PTRACE_ATTACH pid %d %ld\n", msg, pid, res);
    537          if (initial_attach)
    538             output_error = False;
    539       }
    540       return False;
    541    }
    542 
    543    initial_attach = False;
    544    output_error = True;
    545    return waitstopped(pid, SIGSTOP, msg);
    546 }
    547 
    548 /* once we are attached to the pid, get the list of threads and stop
    549    them all.
    550    Returns True if all threads properly suspended, False otherwise. */
    551 static
    552 Bool acquire_and_suspend_threads(int pid)
    553 {
    554    int i;
    555    int rw;
    556    Bool pid_found = False;
    557    Addr vgt;
    558    int sz_tst;
    559    int off_status;
    560    int off_lwpid;
    561    int nr_live_threads = 0;
    562 
    563    if (shared32 != NULL) {
    564       vgt = shared32->threads;
    565       sz_tst = shared32->sizeof_ThreadState;
    566       off_status = shared32->offset_status;
    567       off_lwpid = shared32->offset_lwpid;
    568    }
    569    else if (shared64 != NULL) {
    570       vgt = shared64->threads;
    571       sz_tst = shared64->sizeof_ThreadState;
    572       off_status = shared64->offset_status;
    573       off_lwpid = shared64->offset_lwpid;
    574    } else {
    575       assert (0);
    576    }
    577 
    578    /* note: the entry 0 is unused */
    579    for (i = 1; i < VG_N_THREADS; i++) {
    580       vgt += sz_tst;
    581       rw = ptrace_read_memory(pid, vgt+off_status,
    582                               (unsigned char *)&(vgdb_threads[i].status),
    583                               sizeof(ThreadStatus));
    584       if (rw != 0) {
    585          ERROR(rw, "status ptrace_read_memory\n");
    586          return False;
    587       }
    588 
    589       rw = ptrace_read_memory(pid, vgt+off_lwpid,
    590                               (unsigned char *)&(vgdb_threads[i].lwpid),
    591                               sizeof(Int));
    592       if (rw != 0) {
    593          ERROR(rw, "lwpid ptrace_read_memory\n");
    594          return False;
    595       }
    596 
    597       if (vgdb_threads[i].status != VgTs_Empty) {
    598          DEBUG(1, "found tid %d status %s lwpid %d\n",
    599                i, name_of_ThreadStatus(vgdb_threads[i].status),
    600                vgdb_threads[i].lwpid);
    601          nr_live_threads++;
    602          if (vgdb_threads[i].lwpid <= 1) {
    603             if (vgdb_threads[i].lwpid == 0
    604                 && vgdb_threads[i].status == VgTs_Init) {
    605                DEBUG(1, "not set lwpid tid %d status %s lwpid %d\n",
    606                      i, name_of_ThreadStatus(vgdb_threads[i].status),
    607                      vgdb_threads[i].lwpid);
    608             } else {
    609                ERROR(1, "unexpected lwpid tid %d status %s lwpid %d\n",
    610                      i, name_of_ThreadStatus(vgdb_threads[i].status),
    611                      vgdb_threads[i].lwpid);
    612             }
    613             /* in case we have a VtTs_Init thread with lwpid not yet set,
    614                we try again later. */
    615             return False;
    616          }
    617          if (vgdb_threads[i].lwpid == pid) {
    618             assert (!pid_found);
    619             assert (i == 1);
    620             pid_found = True;
    621          } else {
    622             if (!attach(vgdb_threads[i].lwpid, "attach_thread")) {
    623                  ERROR(0, "ERROR attach pid %d tid %d\n",
    624                        vgdb_threads[i].lwpid, i);
    625                return False;
    626             }
    627          }
    628       }
    629    }
    630    /* If we found no thread, it means the process is stopping, and
    631       we better do not force anything to happen during that. */
    632    if (nr_live_threads > 0)
    633       return True;
    634    else
    635       return False;
    636 }
    637 
    638 static
    639 void detach_from_all_threads(int pid)
    640 {
    641    int i;
    642    long res;
    643    Bool pid_found = False;
    644 
    645    /* detach from all the threads  */
    646    for (i = 1; i < VG_N_THREADS; i++) {
    647       if (vgdb_threads[i].status != VgTs_Empty) {
    648          if (vgdb_threads[i].status == VgTs_Init
    649              && vgdb_threads[i].lwpid == 0) {
    650             DEBUG(1, "skipping PTRACE_DETACH pid %d tid %d status %s\n",
    651                   vgdb_threads[i].lwpid, i,
    652                   name_of_ThreadStatus (vgdb_threads[i].status));
    653          } else {
    654             if (vgdb_threads[i].lwpid == pid) {
    655                assert (!pid_found);
    656                pid_found = True;
    657             }
    658             DEBUG(1, "PTRACE_DETACH pid %d tid %d status %s\n",
    659                   vgdb_threads[i].lwpid, i,
    660                   name_of_ThreadStatus (vgdb_threads[i].status));
    661             res = ptrace (PTRACE_DETACH, vgdb_threads[i].lwpid, NULL, NULL);
    662             if (res != 0) {
    663                ERROR(errno, "PTRACE_DETACH pid %d tid %d status %s res %ld\n",
    664                      vgdb_threads[i].lwpid, i,
    665                      name_of_ThreadStatus (vgdb_threads[i].status),
    666                      res);
    667             }
    668          }
    669       }
    670    }
    671 
    672    if (!pid_found && pid) {
    673       /* No threads are live. Process is busy stopping.
    674          We need to detach from pid explicitely. */
    675       DEBUG(1, "no thread live => PTRACE_DETACH pid %d\n", pid);
    676       res = ptrace (PTRACE_DETACH, pid, NULL, NULL);
    677       if (res != 0)
    678          ERROR(errno, "PTRACE_DETACH pid %d res %ld\n", pid, res);
    679    }
    680 }
    681 
    682 // if > 0, pid for which registers have to be restored.
    683 static int pid_of_save_regs = 0;
    684 static struct user user_save;
    685 
    686 // The below indicates if ptrace_getregs (and ptrace_setregs) can be used.
    687 // Note that some linux versions are defining PTRACE_GETREGS but using
    688 // it gives back EIO.
    689 // has_working_ptrace_getregs can take the following values:
    690 //  -1 : PTRACE_GETREGS is defined
    691 //       runtime check not yet done.
    692 //   0 : PTRACE_GETREGS runtime check has failed.
    693 //   1 : PTRACE_GETREGS defined and runtime check ok.
    694 #ifdef PTRACE_GETREGS
    695 static int has_working_ptrace_getregs = -1;
    696 #endif
    697 
    698 /* Get the registers from pid into regs.
    699    regs_bsz value gives the length of *regs.
    700    Returns True if all ok, otherwise False. */
    701 static
    702 Bool getregs (int pid, void *regs, long regs_bsz)
    703 {
    704    DEBUG(1, "getregs regs_bsz %ld\n", regs_bsz);
    705 #  ifdef PTRACE_GETREGS
    706    if (has_working_ptrace_getregs) {
    707       // Platforms having GETREGS
    708       long res;
    709       DEBUG(1, "getregs PTRACE_GETREGS\n");
    710       res = ptrace (PTRACE_GETREGS, pid, NULL, regs);
    711       if (res == 0) {
    712          if (has_working_ptrace_getregs == -1) {
    713             // First call to PTRACE_GETREGS succesful =>
    714             has_working_ptrace_getregs = 1;
    715             DEBUG(1, "detected a working PTRACE_GETREGS\n");
    716          }
    717          assert (has_working_ptrace_getregs == 1);
    718          return True;
    719       }
    720       else if (has_working_ptrace_getregs == 1) {
    721          // We had a working call, but now it fails.
    722          // This is unexpected.
    723          ERROR(errno, "PTRACE_GETREGS %ld\n", res);
    724          return False;
    725       } else {
    726          // Check this is the first call:
    727          assert (has_working_ptrace_getregs == -1);
    728          if (errno == EIO) {
    729             DEBUG(1, "detected a broken PTRACE_GETREGS with EIO\n");
    730             has_working_ptrace_getregs = 0;
    731             // Fall over to the PTRACE_PEEKUSER case.
    732          } else {
    733             ERROR(errno, "broken PTRACE_GETREGS unexpected errno %ld\n", res);
    734             return False;
    735          }
    736       }
    737    }
    738 #  endif
    739 
    740    // We assume  PTRACE_PEEKUSER is defined everywhere.
    741    {
    742 #     ifdef PT_ENDREGS
    743       long peek_bsz = PT_ENDREGS;
    744       assert (peek_bsz <= regs_bsz);
    745 #     else
    746       long peek_bsz = regs_bsz-1;
    747 #     endif
    748       char *pregs = (char *) regs;
    749       long offset;
    750       errno = 0;
    751       DEBUG(1, "getregs PTRACE_PEEKUSER(s) peek_bsz %ld\n", peek_bsz);
    752       for (offset = 0; offset < peek_bsz; offset = offset + sizeof(long)) {
    753          *(long *)(pregs+offset) = ptrace(PTRACE_PEEKUSER, pid, offset, NULL);
    754          if (errno != 0) {
    755             ERROR(errno, "PTRACE_PEEKUSER offset %ld\n", offset);
    756             return False;
    757          }
    758       }
    759       return True;
    760    }
    761 
    762    // If neither PTRACE_GETREGS not PTRACE_PEEKUSER have returned,
    763    // then we are in serious trouble.
    764    assert (0);
    765 }
    766 
    767 /* Set the registers of pid to regs.
    768    regs_bsz value gives the length of *regs.
    769    Returns True if all ok, otherwise False. */
    770 static
    771 Bool setregs (int pid, void *regs, long regs_bsz)
    772 {
    773    DEBUG(1, "setregs regs_bsz %ld\n", regs_bsz);
    774 // Note : the below is checking for GETREGS, not SETREGS
    775 // as if one is defined and working, the other one should also work.
    776 #  ifdef PTRACE_GETREGS
    777    if (has_working_ptrace_getregs) {
    778       // Platforms having SETREGS
    779       long res;
    780       // setregs can never be called before getregs has done a runtime check.
    781       assert (has_working_ptrace_getregs == 1);
    782       DEBUG(1, "setregs PTRACE_SETREGS\n");
    783       res = ptrace (PTRACE_SETREGS, pid, NULL, regs);
    784       if (res != 0) {
    785          ERROR(errno, "PTRACE_SETREGS %ld\n", res);
    786          return False;
    787       }
    788       return True;
    789    }
    790 #  endif
    791 
    792    {
    793       char *pregs = (char *) regs;
    794       long offset;
    795       long res;
    796 #     ifdef PT_ENDREGS
    797       long peek_bsz = PT_ENDREGS;
    798       assert (peek_bsz <= regs_bsz);
    799 #     else
    800       long peek_bsz = regs_bsz-1;
    801 #     endif
    802       errno = 0;
    803       DEBUG(1, "setregs PTRACE_POKEUSER(s) %ld\n", peek_bsz);
    804       for (offset = 0; offset < peek_bsz; offset = offset + sizeof(long)) {
    805          res = ptrace(PTRACE_POKEUSER, pid, offset, *(long*)(pregs+offset));
    806          if (errno != 0) {
    807             ERROR(errno, "PTRACE_POKEUSER offset %ld res %ld\n", offset, res);
    808             return False;
    809          }
    810       }
    811       return True;
    812    }
    813 
    814    // If neither PTRACE_SETREGS not PTRACE_POKEUSER have returned,
    815    // then we are in serious trouble.
    816    assert (0);
    817 }
    818 
    819 /* Restore the registers to the saved value, then detaches from all threads */
    820 static
    821 void restore_and_detach(int pid)
    822 {
    823    if (pid_of_save_regs) {
    824       /* In case the 'main pid' has been continued, we need to stop it
    825          before resetting the registers. */
    826       if (pid_of_save_regs_continued) {
    827          pid_of_save_regs_continued = False;
    828          if (!stop(pid_of_save_regs, "sigstop before reset regs"))
    829             DEBUG(0, "Could not sigstop before reset");
    830       }
    831 
    832       DEBUG(1, "setregs restore registers pid %d\n", pid_of_save_regs);
    833       if (!setregs(pid_of_save_regs, &user_save.regs, sizeof(user_save.regs))) {
    834          ERROR(errno, "setregs restore registers pid %d after cont\n",
    835                pid_of_save_regs);
    836       }
    837       pid_of_save_regs = 0;
    838    } else {
    839       DEBUG(1, "PTRACE_SETREGS restore registers: no pid\n");
    840    }
    841    detach_from_all_threads(pid);
    842 }
    843 
    844 /* Ensures that the gdbserver code is invoked by pid.
    845    If an error occurs, resets to the valgrind process
    846    to the state it has before being ptrace-d.
    847    Returns True if invoke successful, False otherwise.
    848 */
    849 static
    850 Bool invoke_gdbserver (int pid)
    851 {
    852    static Bool ptrace_restrictions_msg_given = False;
    853    long res;
    854    Bool stopped;
    855    struct user user_mod;
    856    Addr sp;
    857    /* A specific int value is passed to invoke_gdbserver, to check
    858       everything goes according to the plan. */
    859    const int check = 0x8BADF00D; // ate bad food.
    860 
    861    const Addr bad_return = 0;
    862    // A bad return address will be pushed on the stack.
    863    // The function invoke_gdbserver cannot return. If ever it returns, a NULL
    864    // address pushed on the stack should ensure this is detected.
    865 
    866    /* Not yet attached. If problem, vgdb can abort,
    867       no cleanup needed.
    868 
    869       On Ubuntu>= 10.10, a /proc setting can disable ptrace.
    870       So, Valgrind has to SET_PTRACER this vgdb. Once this
    871       is done, this vgdb can ptrace the valgrind process. */
    872 
    873    DEBUG(1, "attach to 'main' pid %d\n", pid);
    874    if (!attach(pid, "attach main pid")) {
    875       if (!ptrace_restrictions_msg_given) {
    876          ptrace_restrictions_msg_given = True;
    877          ERROR(0, "error attach main pid %d\n", pid);
    878          ptrace_restrictions_msg();
    879       }
    880       return False;
    881    }
    882 
    883    /* Now, we are attached. If problem, detach and return. */
    884 
    885    if (!acquire_and_suspend_threads(pid)) {
    886       detach_from_all_threads(pid);
    887       /* if the pid does not exist anymore, we better stop */
    888       if (kill(pid, 0) != 0)
    889         XERROR (errno, "invoke_gdbserver: check for pid %d existence failed\n",
    890                 pid);
    891       return False;
    892    }
    893 
    894    if (!getregs(pid, &user_mod.regs, sizeof(user_mod.regs))) {
    895       detach_from_all_threads(pid);
    896       return False;
    897    }
    898    user_save = user_mod;
    899 
    900 #if defined(VGA_x86)
    901    sp = user_mod.regs.esp;
    902 #elif defined(VGA_amd64)
    903    sp = user_mod.regs.rsp;
    904    if (shared32 != NULL) {
    905      /* 64bit vgdb speaking with a 32bit executable.
    906         To have system call restart properly, we need to sign extend rax.
    907         For more info:
    908         web search '[patch] Fix syscall restarts for amd64->i386 biarch'
    909         e.g. http://sourceware.org/ml/gdb-patches/2009-11/msg00592.html */
    910      *(long *)&user_save.regs.rax = *(int*)&user_save.regs.rax;
    911      DEBUG(1, "Sign extending %8.8lx to %8.8lx\n",
    912            user_mod.regs.rax, user_save.regs.rax);
    913    }
    914 #elif defined(VGA_arm)
    915    sp = user_mod.regs.uregs[13];
    916 #elif defined(VGA_ppc32)
    917    sp = user_mod.regs.gpr[1];
    918 #elif defined(VGA_ppc64)
    919    sp = user_mod.regs.gpr[1];
    920 #elif defined(VGA_s390x)
    921    sp = user_mod.regs.gprs[15];
    922 #else
    923    I_die_here : (sp) architecture missing in vgdb.c
    924 #endif
    925 
    926 
    927    // the magic below is derived from spying what gdb sends to
    928    // the (classical) gdbserver when invoking a C function.
    929    if (shared32 != NULL) {
    930       // vgdb speaking with a 32bit executable.
    931 #if   defined(VGA_x86) || defined(VGA_amd64)
    932       const int regsize = 4;
    933       int rw;
    934       /* push check arg on the stack */
    935       sp = sp - regsize;
    936       DEBUG(1, "push check arg ptrace_write_memory\n");
    937       assert(regsize == sizeof(check));
    938       rw = ptrace_write_memory(pid, sp,
    939                                (unsigned char *) &check,
    940                                regsize);
    941       if (rw != 0) {
    942          ERROR(rw, "push check arg ptrace_write_memory");
    943          detach_from_all_threads(pid);
    944          return False;
    945       }
    946 
    947       sp = sp - regsize;
    948       DEBUG(1, "push bad_return return address ptrace_write_memory\n");
    949       // Note that for a 64 bits vgdb, only 4 bytes of NULL bad_return
    950       // are written.
    951       rw = ptrace_write_memory(pid, sp,
    952                                (unsigned char *) &bad_return,
    953                                regsize);
    954       if (rw != 0) {
    955          ERROR(rw, "push bad_return return address ptrace_write_memory");
    956          detach_from_all_threads(pid);
    957          return False;
    958       }
    959 #if   defined(VGA_x86)
    960       /* set ebp, esp, eip and orig_eax to invoke gdbserver */
    961       // compiled in 32bits, speaking with a 32bits exe
    962       user_mod.regs.ebp = sp; // bp set to sp
    963       user_mod.regs.esp = sp;
    964       user_mod.regs.eip = shared32->invoke_gdbserver;
    965       user_mod.regs.orig_eax = -1L;
    966 #elif defined(VGA_amd64)
    967       /* set ebp, esp, eip and orig_eax to invoke gdbserver */
    968       // compiled in 64bits, speaking with a 32bits exe
    969       user_mod.regs.rbp = sp; // bp set to sp
    970       user_mod.regs.rsp = sp;
    971       user_mod.regs.rip = shared32->invoke_gdbserver;
    972       user_mod.regs.orig_rax = -1L;
    973 #else
    974       I_die_here : not x86 or amd64 in x86/amd64 section/
    975 #endif
    976 
    977 #elif defined(VGA_ppc32) || defined(VGA_ppc64)
    978       user_mod.regs.nip = shared32->invoke_gdbserver;
    979       user_mod.regs.trap = -1L;
    980       /* put check arg in register 3 */
    981       user_mod.regs.gpr[3] = check;
    982       /* put NULL return address in Link Register */
    983       user_mod.regs.link = bad_return;
    984 
    985 #elif defined(VGA_arm)
    986       /* put check arg in register 0 */
    987       user_mod.regs.uregs[0] = check;
    988       /* put NULL return address in Link Register */
    989       user_mod.regs.uregs[14] = bad_return;
    990       user_mod.regs.uregs[15] = shared32->invoke_gdbserver;
    991 
    992 #elif defined(VGA_s390x)
    993       XERROR(0, "(fn32) s390x has no 32bits implementation");
    994 #else
    995       I_die_here : architecture missing in vgdb.c
    996 #endif
    997       }
    998 
    999    else if (shared64 != NULL) {
   1000 #if defined(VGA_x86)
   1001       assert(0); // cannot vgdb a 64 bits executable with a 32 bits exe
   1002 #elif defined(VGA_amd64)
   1003       // vgdb speaking with a 64 bit executable.
   1004       const int regsize = 8;
   1005       int rw;
   1006 
   1007       /* give check arg in rdi */
   1008       user_mod.regs.rdi = check;
   1009 
   1010       /* push return address on stack : return to breakaddr */
   1011       sp = sp - regsize;
   1012       DEBUG(1, "push bad_return return address ptrace_write_memory\n");
   1013       rw = ptrace_write_memory(pid, sp,
   1014                                (unsigned char *) &bad_return,
   1015                                sizeof(bad_return));
   1016       if (rw != 0) {
   1017          ERROR(rw, "push bad_return return address ptrace_write_memory");
   1018          detach_from_all_threads(pid);
   1019          return False;
   1020       }
   1021 
   1022       /* set rbp, rsp, rip and orig_rax to invoke gdbserver */
   1023       user_mod.regs.rbp = sp; // bp set to sp
   1024       user_mod.regs.rsp = sp;
   1025       user_mod.regs.rip = shared64->invoke_gdbserver;
   1026       user_mod.regs.orig_rax = -1L;
   1027 
   1028 #elif defined(VGA_arm)
   1029       assert(0); // cannot vgdb a 64 bits executable with a 32 bits exe
   1030 #elif defined(VGA_ppc32)
   1031       assert(0); // cannot vgdb a 64 bits executable with a 32 bits exe
   1032 #elif defined(VGA_ppc64)
   1033       Addr64 func_addr;
   1034       Addr64 toc_addr;
   1035       int rw;
   1036       rw = ptrace_read_memory(pid, shared64->invoke_gdbserver,
   1037                               (unsigned char *)&func_addr,
   1038                               sizeof(Addr64));
   1039       if (rw != 0) {
   1040          ERROR(rw, "ppc64 read func_addr\n");
   1041          detach_from_all_threads(pid);
   1042          return False;
   1043       }
   1044       rw = ptrace_read_memory(pid, shared64->invoke_gdbserver+8,
   1045                               (unsigned char *)&toc_addr,
   1046                               sizeof(Addr64));
   1047       if (rw != 0) {
   1048          ERROR(rw, "ppc64 read toc_addr\n");
   1049          detach_from_all_threads(pid);
   1050          return False;
   1051       }
   1052       // We are not pushing anything on the stack, so it is not
   1053       // very clear why the sp has to be decreased, but it seems
   1054       // needed. The ppc64 ABI might give some lights on this ?
   1055       user_mod.regs.gpr[1] = sp - 220;
   1056       user_mod.regs.gpr[2] = toc_addr;
   1057       user_mod.regs.nip = func_addr;
   1058       user_mod.regs.trap = -1L;
   1059       /* put check arg in register 3 */
   1060       user_mod.regs.gpr[3] = check;
   1061       /* put bad_return return address in Link Register */
   1062       user_mod.regs.link = bad_return;
   1063 #elif defined(VGA_s390x)
   1064       /* put check arg in register r2 */
   1065       user_mod.regs.gprs[2] = check;
   1066       /* bad_return Return address is in r14 */
   1067       user_mod.regs.gprs[14] = bad_return;
   1068       /* minimum stack frame */
   1069       sp = sp - 160;
   1070       user_mod.regs.gprs[15] = sp;
   1071       /* set program counter */
   1072       user_mod.regs.psw.addr = shared64->invoke_gdbserver;
   1073 #else
   1074       I_die_here: architecture missing in vgdb.c
   1075 #endif
   1076    }
   1077    else {
   1078       assert(0);
   1079    }
   1080 
   1081    if (!setregs(pid, &user_mod.regs, sizeof(user_mod.regs))) {
   1082       detach_from_all_threads(pid);
   1083       return False;
   1084    }
   1085    /* Now that we have modified the registers, we set
   1086       pid_of_save_regs to indicate that restore_and_detach
   1087       must restore the registers in case of cleanup. */
   1088    pid_of_save_regs = pid;
   1089    pid_of_save_regs_continued = False;
   1090 
   1091 
   1092    /* We PTRACE_CONT-inue pid.
   1093       Either gdbserver will be invoked directly (if all
   1094       threads are interruptible) or gdbserver will be
   1095       called soon by the scheduler. In the first case,
   1096       pid will stop on the break inserted above when
   1097       gdbserver returns. In the 2nd case, the break will
   1098       be encountered directly. */
   1099    DEBUG(1, "PTRACE_CONT to invoke\n");
   1100    res = ptrace (PTRACE_CONT, pid, NULL, NULL);
   1101    if (res != 0) {
   1102       ERROR(errno, "PTRACE_CONT\n");
   1103       restore_and_detach(pid);
   1104       return False;
   1105    }
   1106    pid_of_save_regs_continued = True;
   1107    /* Wait for SIGSTOP generated by m_gdbserver.c give_control_back_to_vgdb */
   1108    stopped = waitstopped (pid, SIGSTOP,
   1109                           "waitpid status after PTRACE_CONT to invoke");
   1110    if (stopped) {
   1111       /* Here pid has properly stopped on the break. */
   1112       pid_of_save_regs_continued = False;
   1113       restore_and_detach(pid);
   1114       return True;
   1115    } else {
   1116       /* Whatever kind of problem happened. We shutdown */
   1117       shutting_down = True;
   1118       return False;
   1119    }
   1120 }
   1121 #endif
   1122 
   1123 static
   1124 void cleanup_restore_and_detach(void *v_pid)
   1125 {
   1126    DEBUG(1, "cleanup_restore_and_detach dying: %d\n", dying);
   1127 #ifdef PTRACEINVOKER
   1128    if (!dying)
   1129       restore_and_detach(*(int*)v_pid);
   1130 #endif
   1131 }
   1132 
   1133 /* This function loops till shutting_down becomes true.  In this loop,
   1134    it verifies if valgrind process is reading the characters written
   1135    by vgdb.  The verification is done every max_invoke_ms ms.  If
   1136    valgrind is not reading characters, it will use invoke_gdbserver
   1137    (if PTRACE_INVOKER is defined) to ensure that the gdbserver code is
   1138    called soon by valgrind. */
   1139 static int max_invoke_ms = 100;
   1140 #define NEVER 99999999
   1141 static int cmd_time_out = NEVER;
   1142 static
   1143 void *invoke_gdbserver_in_valgrind(void *v_pid)
   1144 {
   1145    struct timeval cmd_max_end_time;
   1146    Bool cmd_started = False;
   1147    struct timeval invoke_time;
   1148 
   1149    int pid = *(int *)v_pid;
   1150    int written_by_vgdb_before_sleep;
   1151    int seen_by_valgrind_before_sleep;
   1152 
   1153    int invoked_written = -1;
   1154    unsigned int usecs;
   1155 
   1156    pthread_cleanup_push(cleanup_restore_and_detach, v_pid);
   1157 
   1158    while (!shutting_down) {
   1159       written_by_vgdb_before_sleep = VS_written_by_vgdb;
   1160       seen_by_valgrind_before_sleep = VS_seen_by_valgrind;
   1161       DEBUG(3,
   1162             "written_by_vgdb_before_sleep %d "
   1163             "seen_by_valgrind_before_sleep %d\n",
   1164             written_by_vgdb_before_sleep,
   1165             seen_by_valgrind_before_sleep);
   1166       if (cmd_time_out != NEVER
   1167           && !cmd_started
   1168           && written_by_vgdb_before_sleep > seen_by_valgrind_before_sleep) {
   1169          /* A command was started. Record the time at which it was started. */
   1170          DEBUG(1, "IO for command started\n");
   1171          gettimeofday(&cmd_max_end_time, NULL);
   1172          cmd_max_end_time.tv_sec += cmd_time_out;
   1173          cmd_started = True;
   1174       }
   1175       if (max_invoke_ms > 0) {
   1176          usecs = 1000 * max_invoke_ms;
   1177          gettimeofday(&invoke_time, NULL);
   1178          invoke_time.tv_sec += max_invoke_ms / 1000;
   1179          invoke_time.tv_usec += 1000 * (max_invoke_ms % 1000);
   1180          invoke_time.tv_sec += invoke_time.tv_usec / (1000 * 1000);
   1181          invoke_time.tv_usec = invoke_time.tv_usec % (1000 * 1000);
   1182       } else {
   1183          usecs = 0;
   1184       }
   1185       if (cmd_started) {
   1186          // 0 usecs here means the thread just has to check gdbserver eats
   1187          // the characters in <= cmd_time_out seconds.
   1188          // We will just wait by 1 second max at a time.
   1189          if (usecs == 0 || usecs > 1000 * 1000)
   1190             usecs = 1000 * 1000;
   1191       }
   1192       usleep(usecs);
   1193 
   1194       /* If nothing happened during our sleep, let's try to wake up valgrind
   1195          or check for cmd time out. */
   1196       if (written_by_vgdb_before_sleep == VS_written_by_vgdb
   1197           && seen_by_valgrind_before_sleep == VS_seen_by_valgrind
   1198           && VS_written_by_vgdb > VS_seen_by_valgrind) {
   1199          struct timeval now;
   1200          gettimeofday(&now, NULL);
   1201          DEBUG(2,
   1202                "after sleep "
   1203                "written_by_vgdb %d "
   1204                "seen_by_valgrind %d "
   1205                "invoked_written %d\n",
   1206                VS_written_by_vgdb,
   1207                VS_seen_by_valgrind,
   1208                invoked_written);
   1209          /* if the pid does not exist anymore, we better stop */
   1210          if (kill(pid, 0) != 0)
   1211            XERROR (errno,
   1212                    "invoke_gdbserver_in_valgrind: "
   1213                    "check for pid %d existence failed\n", pid);
   1214          if (cmd_started) {
   1215             if (timercmp (&now, &cmd_max_end_time, >))
   1216                XERROR (0,
   1217                        "pid %d did not handle a command in %d seconds\n",
   1218                        pid, cmd_time_out);
   1219          }
   1220          if (max_invoke_ms > 0 && timercmp (&now, &invoke_time, >=)) {
   1221             #if defined(PTRACEINVOKER)
   1222             /* only need to wake up if the nr written has changed since
   1223                last invoke. */
   1224             if (invoked_written != written_by_vgdb_before_sleep) {
   1225                if (invoke_gdbserver(pid)) {
   1226                   /* If invoke succesful, no need to invoke again
   1227                      for the same value of written_by_vgdb_before_sleep. */
   1228                   invoked_written = written_by_vgdb_before_sleep;
   1229                }
   1230             }
   1231             #else
   1232             DEBUG(2, "invoke_gdbserver via ptrace not (yet) implemented\n");
   1233             #endif
   1234          }
   1235       } else {
   1236          // Something happened => restart timer check.
   1237          if (cmd_time_out != NEVER) {
   1238             DEBUG(2, "some IO was done => restart command\n");
   1239             cmd_started = False;
   1240          }
   1241       }
   1242    }
   1243    pthread_cleanup_pop(0);
   1244    return NULL;
   1245 }
   1246 
   1247 static
   1248 int open_fifo (char* name, int flags, char* desc)
   1249 {
   1250    int fd;
   1251    DEBUG(1, "opening %s %s\n", name, desc);
   1252    fd = open(name, flags);
   1253    if (fd == -1)
   1254       XERROR (errno, "error opening %s %s\n", name, desc);
   1255 
   1256    DEBUG(1, "opened %s %s fd %d\n", name, desc, fd);
   1257    return fd;
   1258 }
   1259 
   1260 /* acquire a lock on the first byte of the given fd. If not successful,
   1261    exits with error.
   1262    This allows to avoid having two vgdb speaking with the same Valgrind
   1263    gdbserver as this causes serious headaches to the protocol. */
   1264 static
   1265 void acquire_lock (int fd, int valgrind_pid)
   1266 {
   1267    struct flock fl;
   1268    fl.l_type = F_WRLCK;
   1269    fl.l_whence = SEEK_SET;
   1270    fl.l_start = 0;
   1271    fl.l_len = 1;
   1272    if (fcntl(fd, F_SETLK, &fl) < 0) {
   1273       if (errno == EAGAIN || errno == EACCES) {
   1274          XERROR(errno,
   1275                 "Cannot acquire lock.\n"
   1276                 "Probably vgdb pid %d already speaks with Valgrind pid %d\n",
   1277                 VS_vgdb_pid,
   1278                 valgrind_pid);
   1279       } else {
   1280          XERROR(errno, "cannot acquire lock.\n");
   1281       }
   1282    }
   1283 
   1284    /* Here, we have the lock. It will be released when fd will be closed. */
   1285    /* We indicate our pid to Valgrind gdbserver */
   1286    if (shared32 != NULL)
   1287       shared32->vgdb_pid = getpid();
   1288    else if (shared64 != NULL)
   1289       shared64->vgdb_pid = getpid();
   1290    else
   1291       assert(0);
   1292 }
   1293 
   1294 #define PBUFSIZ 16384 /* keep in sync with server.h */
   1295 
   1296 /* read some characters from fd.
   1297    Returns the nr of characters read, -1 if error.
   1298    desc is a string used in tracing */
   1299 static
   1300 int read_buf (int fd, char* buf, char* desc)
   1301 {
   1302    int nrread;
   1303    DEBUG(2, "reading %s\n", desc);
   1304    nrread = read(fd, buf, PBUFSIZ);
   1305    if (nrread == -1) {
   1306       ERROR (errno, "error reading %s\n", desc);
   1307       return -1;
   1308    }
   1309    buf[nrread] = '\0';
   1310    DEBUG(2, "read %s %s\n", desc, buf);
   1311    return nrread;
   1312 }
   1313 
   1314 /* write size bytes from buf to fd.
   1315    desc is a description of the action for which the write is done.
   1316    If notify, then add size to the shared cntr indicating to the
   1317    valgrind process that there is new data.
   1318    Returns True if write is ok, False if there was a problem. */
   1319 static
   1320 Bool write_buf(int fd, char* buf, int size, char* desc, Bool notify)
   1321 {
   1322    int nrwritten;
   1323    int nrw;
   1324    DEBUG(2, "writing %s len %d %s notify: %d\n", desc, size, buf, notify);
   1325    nrwritten = 0;
   1326    while (nrwritten < size) {
   1327       nrw = write (fd, buf+nrwritten, size - nrwritten);
   1328       if (nrw == -1) {
   1329          ERROR(errno, "error write %s\n", desc);
   1330          return False;
   1331       }
   1332       nrwritten = nrwritten + nrw;
   1333       if (notify)
   1334          add_written(nrw);
   1335    }
   1336    return True;
   1337 }
   1338 
   1339 typedef enum {
   1340    FROM_GDB,
   1341    TO_GDB,
   1342    FROM_PID,
   1343    TO_PID } ConnectionKind;
   1344 static const int NumConnectionKind = TO_PID+1;
   1345 static
   1346 char *ppConnectionKind (ConnectionKind con)
   1347 {
   1348    switch (con) {
   1349    case FROM_GDB: return "FROM_GDB";
   1350    case TO_GDB:   return "TO_GDB";
   1351    case FROM_PID: return "FROM_PID";
   1352    case TO_PID:   return "TO_PID";
   1353    default:       return "invalid connection kind";
   1354    }
   1355 }
   1356 
   1357 static char *shared_mem;
   1358 
   1359 static int from_gdb = 0; /* stdin by default, changed if --port is given. */
   1360 static char *from_gdb_to_pid; /* fifo name to write gdb command to pid */
   1361 /* Returns True in case read/write operations were done properly.
   1362    Returns False in case of error.
   1363    to_pid is the file descriptor to write to the process pid. */
   1364 static
   1365 Bool read_from_gdb_write_to_pid(int to_pid)
   1366 {
   1367    char buf[PBUFSIZ];
   1368    int nrread;
   1369 
   1370    nrread = read_buf(from_gdb, buf, "from gdb on stdin");
   1371    if (nrread <= 0) {
   1372       if (nrread == 0)
   1373          DEBUG(1, "read 0 bytes from gdb => assume exit\n");
   1374       else
   1375          DEBUG(1, "error reading bytes from gdb\n");
   1376       close (from_gdb);
   1377       shutting_down = True;
   1378       return False;
   1379    }
   1380    return write_buf(to_pid, buf, nrread, "to_pid", /* notify */ True);
   1381 }
   1382 
   1383 static int to_gdb = 1; /* stdout by default, changed if --port is given. */
   1384 static char *to_gdb_from_pid; /* fifo name to read pid replies */
   1385 /* Returns True in case read/write operations were done properly.
   1386    Returns False in case of error.
   1387    from_pid is the file descriptor to read data from the process pid. */
   1388 static
   1389 Bool read_from_pid_write_to_gdb(int from_pid)
   1390 {
   1391    char buf[PBUFSIZ];
   1392    int nrread;
   1393 
   1394    nrread = read_buf(from_pid, buf, "from pid");
   1395    if (nrread <= 0) {
   1396       if (nrread == 0)
   1397          DEBUG(1, "read 0 bytes from pid => assume exit\n");
   1398       else
   1399          DEBUG(1, "error reading bytes from pid\n");
   1400       close (from_pid);
   1401       shutting_down = True;
   1402       return False;
   1403    }
   1404    return write_buf(to_gdb, buf, nrread, "to_gdb", /* notify */ False);
   1405 }
   1406 
   1407 static
   1408 void wait_for_gdb_connect (int in_port)
   1409 {
   1410    struct sockaddr_in addr;
   1411 
   1412    int listen_gdb = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
   1413    int gdb_connect;
   1414 
   1415    if (-1 == listen_gdb) {
   1416       XERROR(errno, "cannot create socket");
   1417    }
   1418 
   1419     memset(&addr, 0, sizeof(addr));
   1420 
   1421     addr.sin_family = AF_INET;
   1422     addr.sin_port = htons((unsigned short int)in_port);
   1423     addr.sin_addr.s_addr = INADDR_ANY;
   1424 
   1425     if (-1 == bind(listen_gdb,(struct sockaddr *)&addr, sizeof(addr))) {
   1426       XERROR(errno, "bind failed");
   1427     }
   1428     fprintf(stderr, "listening on port %d ...", in_port);
   1429     fflush(stderr);
   1430     if (-1 == listen(listen_gdb, 1)) {
   1431       XERROR(errno, "error listen failed");
   1432     }
   1433 
   1434     gdb_connect = accept(listen_gdb, NULL, NULL);
   1435     if (gdb_connect < 0) {
   1436         XERROR(errno, "accept failed");
   1437     }
   1438     fprintf(stderr, "connected.\n");
   1439     fflush(stderr);
   1440     close(listen_gdb);
   1441     from_gdb = gdb_connect;
   1442     to_gdb = gdb_connect;
   1443 }
   1444 
   1445 /* prepares the FIFOs filenames, map the shared memory. */
   1446 static
   1447 void prepare_fifos_and_shared_mem(int pid)
   1448 {
   1449    const HChar *user, *host;
   1450    unsigned len;
   1451 
   1452    user = getenv("LOGNAME");
   1453    if (user == NULL) user = getenv("USER");
   1454    if (user == NULL) user = "???";
   1455 
   1456    host = getenv("HOST");
   1457    if (host == NULL) host = getenv("HOSTNAME");
   1458    if (host == NULL) host = "???";
   1459 
   1460    len = strlen(vgdb_prefix) + strlen(user) + strlen(host) + 40;
   1461    from_gdb_to_pid = vmalloc (len);
   1462    to_gdb_from_pid = vmalloc (len);
   1463    shared_mem      = vmalloc (len);
   1464    /* below 3 lines must match the equivalent in remote-utils.c */
   1465    sprintf(from_gdb_to_pid, "%s-from-vgdb-to-%d-by-%s-on-%s",    vgdb_prefix,
   1466            pid, user, host);
   1467    sprintf(to_gdb_from_pid, "%s-to-vgdb-from-%d-by-%s-on-%s",    vgdb_prefix,
   1468            pid, user, host);
   1469    sprintf(shared_mem,      "%s-shared-mem-vgdb-%d-by-%s-on-%s", vgdb_prefix,
   1470            pid, user, host);
   1471    DEBUG (1, "vgdb: using %s %s %s\n",
   1472           from_gdb_to_pid, to_gdb_from_pid, shared_mem);
   1473 
   1474    map_vgdbshared(shared_mem);
   1475 }
   1476 
   1477 /* Convert hex digit A to a number.  */
   1478 
   1479 static int
   1480 fromhex (int a)
   1481 {
   1482    if (a >= '0' && a <= '9')
   1483       return a - '0';
   1484    else if (a >= 'a' && a <= 'f')
   1485       return a - 'a' + 10;
   1486    else
   1487       XERROR(0, "Reply contains invalid hex digit %c\n", a);
   1488   return 0;
   1489 }
   1490 
   1491 /* Returns next char from fd.  -1 if error, -2 if EOF.
   1492    NB: must always call it with the same fd */
   1493 static int
   1494 readchar (int fd)
   1495 {
   1496   static unsigned char buf[PBUFSIZ];
   1497   static int bufcnt = 0;
   1498   static unsigned char *bufp;
   1499 
   1500   if (bufcnt-- > 0)
   1501      return *bufp++;
   1502 
   1503   bufcnt = read (fd, buf, sizeof (buf));
   1504 
   1505   if (bufcnt <= 0) {
   1506      if (bufcnt == 0) {
   1507         fprintf (stderr, "readchar: Got EOF\n");
   1508         return -2;
   1509      } else {
   1510         ERROR (errno, "readchar\n");
   1511         return -1;
   1512      }
   1513   }
   1514 
   1515   bufp = buf;
   1516   bufcnt--;
   1517   return *bufp++;
   1518 }
   1519 
   1520 /* Read a packet from fromfd, with error checking,
   1521    and store it in BUF.
   1522    Returns length of packet, or -1 if error or -2 if EOF.
   1523    Writes ack on ackfd */
   1524 
   1525 static int
   1526 getpkt (char *buf, int fromfd, int ackfd)
   1527 {
   1528   char *bp;
   1529   unsigned char csum, c1, c2;
   1530   int c;
   1531 
   1532   while (1) {
   1533      csum = 0;
   1534 
   1535      while (1) {
   1536         c = readchar (fromfd);
   1537         if (c == '$')
   1538            break;
   1539         DEBUG(2, "[getpkt: discarding char '%c']\n", c);
   1540         if (c < 0)
   1541            return c;
   1542      }
   1543 
   1544      bp = buf;
   1545      while (1) {
   1546         c = readchar (fromfd);
   1547         if (c < 0)
   1548            return c;
   1549         if (c == '#')
   1550            break;
   1551         if (c == '*') {
   1552            int repeat;
   1553            int r;
   1554            int prev;
   1555            prev = *(bp-1);
   1556            csum += c;
   1557            repeat = readchar (fromfd);
   1558            csum += repeat;
   1559            for (r = 0; r < repeat - 29; r ++)
   1560               *bp++ = prev;
   1561         } else {
   1562            *bp++ = c;
   1563            csum += c;
   1564         }
   1565      }
   1566      *bp = 0;
   1567 
   1568      c1 = fromhex (readchar (fromfd));
   1569      c2 = fromhex (readchar (fromfd));
   1570 
   1571      if (csum == (c1 << 4) + c2)
   1572 	break;
   1573 
   1574      fprintf (stderr, "Bad checksum, sentsum=0x%x, csum=0x%x, buf=%s\n",
   1575               (c1 << 4) + c2, csum, buf);
   1576      if (write (ackfd, "-", 1) != 1)
   1577         ERROR(0, "error when writing - (nack)\n");
   1578      else
   1579         add_written(1);
   1580   }
   1581 
   1582   DEBUG(2, "getpkt (\"%s\");  [sending ack] \n", buf);
   1583   if (write (ackfd, "+", 1) != 1)
   1584      ERROR(0, "error when writing + (ack)\n");
   1585   else
   1586      add_written(1);
   1587   return bp - buf;
   1588 }
   1589 
   1590 static int sigint = 0;
   1591 static int sigterm = 0;
   1592 static int sigpipe = 0;
   1593 static int sighup = 0;
   1594 static int sigusr1 = 0;
   1595 static int sigalrm = 0;
   1596 static int sigusr1_fd = -1;
   1597 static pthread_t invoke_gdbserver_in_valgrind_thread;
   1598 
   1599 static
   1600 void received_signal (int signum)
   1601 {
   1602    if (signum == SIGINT)
   1603       sigint++;
   1604    else if (signum == SIGUSR1) {
   1605       sigusr1++;
   1606       if (sigusr1_fd >= 0) {
   1607          char control_c = '\003';
   1608          write_buf(sigusr1_fd, &control_c, 1,
   1609                    "write \\003 on SIGUSR1", /* notify */ True);
   1610       }
   1611    }
   1612    else if (signum == SIGTERM) {
   1613       shutting_down = True;
   1614       sigterm++;
   1615    } else if (signum == SIGHUP) {
   1616       shutting_down = True;
   1617       sighup++;
   1618    } else if (signum == SIGPIPE) {
   1619       sigpipe++;
   1620    } else if (signum == SIGALRM) {
   1621       sigalrm++;
   1622 #if defined(VGPV_arm_linux_android)
   1623       /* Android has no pthread_cancel. As it also does not have
   1624          PTRACE_INVOKER, there is no need for cleanup action.
   1625          So, we just do nothing. */
   1626       DEBUG(1, "sigalrm received, no action on android\n");
   1627 #else
   1628       /* Note: we cannot directly invoke restore_and_detach : this must
   1629          be done by the thread that has attached.
   1630          We have in this thread pushed a cleanup handler that will
   1631          cleanup what is needed. */
   1632       DEBUG(1, "pthread_cancel invoke_gdbserver_in_valgrind_thread\n");
   1633       pthread_cancel(invoke_gdbserver_in_valgrind_thread);
   1634 #endif
   1635    } else {
   1636       ERROR(0, "unexpected signal %d\n", signum);
   1637    }
   1638 }
   1639 
   1640 /* install the signal handlers allowing e.g. vgdb to cleanup in
   1641    case of termination. */
   1642 static
   1643 void install_handlers(void)
   1644 {
   1645    struct sigaction action, oldaction;
   1646 
   1647    action.sa_handler = received_signal;
   1648    sigemptyset (&action.sa_mask);
   1649    action.sa_flags = 0;
   1650 
   1651    /* SIGINT: when user types C-c in gdb, this sends
   1652       a SIGINT to vgdb + causes a character to be sent to remote gdbserver.
   1653       The later is enough to wakeup the valgrind process. */
   1654    if (sigaction (SIGINT, &action, &oldaction) != 0)
   1655       XERROR (errno, "vgdb error sigaction SIGINT\n");
   1656    /* We might do something more intelligent than just
   1657       reporting this SIGINT E.g. behave similarly to the gdb: two
   1658       control-C without feedback from the debugged process would
   1659       mean to stop debugging it. */
   1660 
   1661    /* SIGUSR1: this is used to facilitate automatic testing.  When
   1662       vgdb receives this signal, it will simulate the user typing C-c. */
   1663    if (sigaction (SIGUSR1, &action, &oldaction) != 0)
   1664       XERROR (errno, "vgdb error sigaction SIGUSR1\n");
   1665 
   1666 
   1667    /* SIGTERM: can receive this signal (e.g. from gdb) to terminate vgdb
   1668       when detaching or similar. A clean shutdown will be done as both
   1669       the read and write side will detect an end of file. */
   1670    if (sigaction (SIGTERM, &action, &oldaction) != 0)
   1671       XERROR (errno, "vgdb error sigaction SIGTERM\n");
   1672 
   1673    /* SIGPIPE: can receive this signal when gdb detaches or kill the
   1674       process debugged: gdb will close its pipes to vgdb. vgdb
   1675       must resist to this signal to allow a clean shutdown. */
   1676    if (sigaction (SIGPIPE, &action, &oldaction) != 0)
   1677       XERROR (errno, "vgdb error sigaction SIGPIPE\n");
   1678 
   1679    /* SIGALRM: in case invoke thread is blocked, alarm is used
   1680       to cleanup.  */
   1681    if (sigaction (SIGALRM, &action, &oldaction) != 0)
   1682       XERROR (errno, "vgdb error sigaction SIGALRM\n");
   1683 }
   1684 
   1685 /* close the FIFOs provided connections, terminate the invoker thread.  */
   1686 static
   1687 void close_connection(int to_pid, int from_pid)
   1688 {
   1689    DEBUG(1, "nr received signals: sigint %d sigterm %d sighup %d sigpipe %d\n",
   1690          sigint, sigterm, sighup, sigpipe);
   1691    /* Note that we do not forward sigterm to the valgrind process:
   1692       a sigterm signal is (probably) received from gdb if the user wants to
   1693       kill the debugged process. The kill instruction has been given to
   1694       the valgrind process, which should execute a clean exit. */
   1695 
   1696    /* We first close the connection to pid. The pid will then
   1697       terminates its gdbserver work. We keep the from pid
   1698       fifo opened till the invoker thread is finished.
   1699       This allows the gdbserver to finish sending its last reply. */
   1700    if (close(to_pid) != 0)
   1701       ERROR(errno, "close to_pid\n");
   1702 
   1703    /* if there is a task that was busy trying to wake up valgrind
   1704       process, we wait for it to be terminated otherwise threads
   1705       in the valgrind process can stay stopped if vgdb main
   1706       exits before the invoke thread had time to detach from
   1707       all valgrind threads. */
   1708    if (max_invoke_ms > 0 || cmd_time_out != NEVER) {
   1709       int join;
   1710 
   1711       /* It is surprisingly complex to properly shutdown or exit the
   1712          valgrind process in which gdbserver has been invoked through
   1713          ptrace.  In the normal case (gdb detaches from the process,
   1714          or process is continued), the valgrind process will reach the
   1715          breakpoint place.  Using ptrace, vgdb will ensure the
   1716          previous activity of the process is resumed (e.g. restart a
   1717          blocking system call).  The special case is when gdb asks the
   1718          valgrind process to exit (using either the "kill" command or
   1719          "monitor exit").  In such a case, the valgrind process will
   1720          call exit.  But a ptraced process will be blocked in exit,
   1721          waiting for the ptracing process to detach or die. vgdb
   1722          cannot detach unconditionally as otherwise, in the normal
   1723          case, the valgrind process would stop abnormally with SIGSTOP
   1724          (as vgdb would not be there to catch it). vgdb can also not
   1725          die unconditionally otherwise again, similar problem.  So, we
   1726          assume that most of the time, we arrive here in the normal
   1727          case, and so, the breakpoint has been encountered by the
   1728          valgrind process, so the invoker thread will exit and the
   1729          join will succeed.  For the "kill" case, we cause an alarm
   1730          signal to be sent after a few seconds. This means that in the
   1731          normal case, the gdbserver code in valgrind process must have
   1732          returned the control in less than the alarm nr of seconds,
   1733          otherwise, valgrind will stop abnormally with SIGSTOP. */
   1734       (void) alarm (3);
   1735 
   1736       DEBUG(1, "joining with invoke_gdbserver_in_valgrind_thread\n");
   1737       join = pthread_join(invoke_gdbserver_in_valgrind_thread, NULL);
   1738       if (join != 0)
   1739          XERROR
   1740             (join,
   1741              "vgdb error pthread_join invoke_gdbserver_in_valgrind_thread\n");
   1742    }
   1743    if (close(from_pid) != 0)
   1744       ERROR(errno, "close from_pid\n");
   1745 }
   1746 
   1747 /* Relay data between gdb and Valgrind gdbserver, till EOF or an
   1748    error is encountered. */
   1749 static
   1750 void gdb_relay (int pid)
   1751 {
   1752    int from_pid = -1; /* fd to read from pid */
   1753    int to_pid = -1; /* fd to write to pid */
   1754 
   1755    int shutdown_loop = 0;
   1756    fprintf (stderr, "relaying data between gdb and process %d\n", pid);
   1757    fflush (stderr);
   1758 
   1759    if (max_invoke_ms > 0)
   1760       pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL,
   1761                      invoke_gdbserver_in_valgrind, (void *) &pid);
   1762    to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid");
   1763    acquire_lock (shared_mem_fd, pid);
   1764 
   1765    from_pid = open_fifo (to_gdb_from_pid, O_RDONLY|O_NONBLOCK,
   1766                          "read mode from pid");
   1767 
   1768    sigusr1_fd = to_pid; /* allow simulating user typing control-c */
   1769 
   1770    while (1) {
   1771       ConnectionKind ck;
   1772       int ret;
   1773       struct pollfd pollfds[NumConnectionKind];
   1774 
   1775       /* watch data written by gdb, watch POLLERR on both gdb fd */
   1776       pollfds[FROM_GDB].fd = from_gdb;
   1777       pollfds[FROM_GDB].events = POLLIN;
   1778       pollfds[FROM_GDB].revents = 0;
   1779       pollfds[TO_GDB].fd = to_gdb;
   1780       pollfds[TO_GDB].events = 0;
   1781       pollfds[TO_GDB].revents = 0;
   1782 
   1783       /* watch data written by pid, watch POLLERR on both pid fd */
   1784       pollfds[FROM_PID].fd = from_pid;
   1785       pollfds[FROM_PID].events = POLLIN;
   1786       pollfds[FROM_PID].revents = 0;
   1787       pollfds[TO_PID].fd = to_pid;
   1788       pollfds[TO_PID].events = 0;
   1789       pollfds[TO_PID].revents = 0;
   1790 
   1791       ret = poll(pollfds,
   1792                  NumConnectionKind,
   1793                  (shutting_down ?
   1794                   1 /* one second */
   1795                   : -1 /* infinite */));
   1796       DEBUG(2, "poll ret %d errno %d\n", ret, errno);
   1797 
   1798       /* check for unexpected error */
   1799       if (ret <= 0 && errno != EINTR) {
   1800          ERROR (errno, "unexpected poll ret %d\n", ret);
   1801          shutting_down = True;
   1802          break;
   1803       }
   1804 
   1805       /* check for data to read */
   1806       for (ck = 0; ck < NumConnectionKind; ck ++) {
   1807          if (pollfds[ck].revents & POLLIN) {
   1808             switch (ck) {
   1809             case FROM_GDB:
   1810                if (!read_from_gdb_write_to_pid(to_pid))
   1811                   shutting_down = True;
   1812                break;
   1813                case FROM_PID:
   1814                   if (!read_from_pid_write_to_gdb(from_pid))
   1815                      shutting_down = True;
   1816                   break;
   1817             default: XERROR(0, "unexpected POLLIN on %s\n",
   1818                                ppConnectionKind(ck));
   1819             }
   1820          }
   1821       }
   1822 
   1823       /* check for an fd being in error condition */
   1824       for (ck = 0; ck < NumConnectionKind; ck ++) {
   1825          if (pollfds[ck].revents & POLLERR) {
   1826             DEBUG(1, "connection %s fd %d POLLERR error condition\n",
   1827                      ppConnectionKind(ck), pollfds[ck].fd);
   1828             valgrind_dying();
   1829             shutting_down = True;
   1830          }
   1831          if (pollfds[ck].revents & POLLHUP) {
   1832             DEBUG(1, "connection %s fd %d POLLHUP error condition\n",
   1833                   ppConnectionKind(ck), pollfds[ck].fd);
   1834             valgrind_dying();
   1835             shutting_down = True;
   1836          }
   1837          if (pollfds[ck].revents & POLLNVAL) {
   1838             DEBUG(1, "connection %s fd %d POLLNVAL error condition\n",
   1839                   ppConnectionKind(ck), pollfds[ck].fd);
   1840             valgrind_dying();
   1841             shutting_down = True;
   1842          }
   1843       }
   1844 
   1845       if (shutting_down) {
   1846          /* we let some time to the final packets to be transferred */
   1847          shutdown_loop++;
   1848          if (shutdown_loop > 3)
   1849             break;
   1850       }
   1851    }
   1852    close_connection(to_pid, from_pid);
   1853 }
   1854 
   1855 static int packet_len_for_command(char *cmd)
   1856 {
   1857    /* cmd will be send as a packet $qRcmd,xxxx....................xx#cc      */
   1858    return                          7+     2*strlen(cmd)             +3  + 1;
   1859 }
   1860 
   1861 /* hyper-minimal protocol implementation that
   1862    sends the provided commands (using qRcmd packets)
   1863    and read and display their replies. */
   1864 static
   1865 void standalone_send_commands(int pid,
   1866                               int last_command,
   1867                               char *commands[] )
   1868 {
   1869    int from_pid = -1; /* fd to read from pid */
   1870    int to_pid = -1; /* fd to write to pid */
   1871 
   1872    int i;
   1873    int hi;
   1874    unsigned char hex[3];
   1875    unsigned char cksum;
   1876    unsigned char *hexcommand;
   1877    unsigned char buf[PBUFSIZ];
   1878    int buflen;
   1879    int nc;
   1880 
   1881 
   1882    if (max_invoke_ms > 0 || cmd_time_out != NEVER)
   1883       pthread_create(&invoke_gdbserver_in_valgrind_thread, NULL,
   1884                      invoke_gdbserver_in_valgrind, (void *) &pid);
   1885 
   1886    to_pid = open_fifo(from_gdb_to_pid, O_WRONLY, "write to pid");
   1887    acquire_lock (shared_mem_fd, pid);
   1888 
   1889    /* first send a C-c \003 to pid, so that it wakes up the process
   1890       After that, we can open the fifo from the pid in read mode
   1891       We then start to wait for packets (normally first a resume reply)
   1892       At that point, we send our command and expect replies */
   1893    buf[0] = '\003';
   1894    write_buf(to_pid, buf, 1, "write \\003 to wake up", /* notify */ True);
   1895    from_pid = open_fifo(to_gdb_from_pid, O_RDONLY,
   1896                         "read cmd result from pid");
   1897 
   1898    for (nc = 0; nc <= last_command; nc++) {
   1899       fprintf (stderr, "sending command %s to pid %d\n", commands[nc], pid);
   1900       fflush (stderr);
   1901 
   1902       /* prepare hexcommand $qRcmd,xxxx....................xx#cc      */
   1903       hexcommand = vmalloc (packet_len_for_command(commands[nc]));
   1904       hexcommand[0] = 0;
   1905       strcat (hexcommand, "$qRcmd,");
   1906       for (i = 0; i < strlen(commands[nc]); i++) {
   1907          sprintf(hex, "%02x", commands[nc][i]);
   1908          strcat (hexcommand, hex);
   1909       }
   1910       /* checksum (but without the $) */
   1911       cksum = 0;
   1912       for (hi = 1; hi < strlen(hexcommand); hi++)
   1913          cksum+=hexcommand[hi];
   1914       strcat(hexcommand, "#");
   1915       sprintf(hex, "%02x", cksum);
   1916       strcat(hexcommand, hex);
   1917       write_buf(to_pid, hexcommand, strlen(hexcommand),
   1918                 "writing hex command to pid", /* notify */ True);
   1919 
   1920       /* we exit of the below loop explicitely when the command has
   1921          been handled or because a signal handler will set
   1922          shutting_down. */
   1923       while (!shutting_down) {
   1924          buflen = getpkt(buf, from_pid, to_pid);
   1925          if (buflen < 0) {
   1926             ERROR (0, "error reading packet\n");
   1927             if (buflen == -2)
   1928                valgrind_dying();
   1929             break;
   1930          }
   1931          if (strlen(buf) == 0) {
   1932             DEBUG(0, "empty packet rcvd (packet qRcmd not recognised?)\n");
   1933             break;
   1934          }
   1935          if (strcmp(buf, "OK") == 0) {
   1936             DEBUG(1, "OK packet rcvd\n");
   1937             break;
   1938          }
   1939          if (buf[0] == 'E') {
   1940             DEBUG(0,
   1941                   "E NN error packet rcvd: %s (unknown monitor command?)\n",
   1942                   buf);
   1943             break;
   1944          }
   1945          if (buf[0] == 'W') {
   1946             DEBUG(0, "W stopped packet rcvd: %s\n", buf);
   1947             break;
   1948          }
   1949          if (buf[0] == 'T') {
   1950             DEBUG(1, "T resume reply packet received: %s\n", buf);
   1951             continue;
   1952          }
   1953 
   1954          /* must be here an O packet with hex encoded string reply
   1955             => decode and print it */
   1956          if (buf[0] != 'O') {
   1957             DEBUG(0, "expecting O packet, received: %s\n", buf);
   1958             continue;
   1959          }
   1960          {
   1961             char buf_print[buflen/2 + 1];
   1962             for (i = 1; i < buflen; i = i + 2)
   1963                buf_print[i/2] = (fromhex(*(buf+i)) << 4)
   1964                      + fromhex(*(buf+i+1));
   1965             buf_print[buflen/2] = 0;
   1966             printf("%s", buf_print);
   1967             fflush(stdout);
   1968          }
   1969       }
   1970       free (hexcommand);
   1971    }
   1972    shutting_down = True;
   1973 
   1974    close_connection(to_pid, from_pid);
   1975 }
   1976 
   1977 /* report to user the existence of a vgdb-able valgrind process
   1978    with given pid */
   1979 static
   1980 void report_pid (int pid, Bool on_stdout)
   1981 {
   1982    char cmdline_file[100];
   1983    char cmdline[1000];
   1984    int fd;
   1985    int i, sz;
   1986 
   1987    sprintf(cmdline_file, "/proc/%d/cmdline", pid);
   1988    fd = open (cmdline_file, O_RDONLY);
   1989    if (fd == -1) {
   1990       DEBUG(1, "error opening cmdline file %s %s\n",
   1991             cmdline_file, strerror(errno));
   1992       sprintf(cmdline, "(could not obtain process command line)");
   1993    } else {
   1994       sz = read(fd, cmdline, 1000);
   1995       for (i = 0; i < sz; i++)
   1996          if (cmdline[i] == 0)
   1997             cmdline[i] = ' ';
   1998       cmdline[sz] = 0;
   1999       close (fd);
   2000    }
   2001    fprintf((on_stdout ? stdout : stderr), "use --pid=%d for %s\n", pid, cmdline);
   2002    fflush((on_stdout ? stdout : stderr));
   2003 }
   2004 
   2005 /* Possibly produces additional usage information documenting the
   2006    ptrace restrictions. */
   2007 static
   2008 void ptrace_restrictions_msg(void)
   2009 {
   2010 #  ifdef PR_SET_PTRACER
   2011    char *ptrace_scope_setting_file = "/proc/sys/kernel/yama/ptrace_scope";
   2012    int fd = -1;
   2013    char ptrace_scope = 'X';
   2014    fd = open (ptrace_scope_setting_file, O_RDONLY, 0);
   2015    if (fd >= 0 && (read (fd, &ptrace_scope, 1) == 1) && (ptrace_scope != '0')) {
   2016       fprintf (stderr,
   2017                "Note: your kernel restricts ptrace invoker using %s\n"
   2018                "vgdb will only be able to attach to a Valgrind process\n"
   2019                "blocked in a system call *after* an initial successful attach\n",
   2020                ptrace_scope_setting_file);
   2021    } else if (ptrace_scope == 'X') {
   2022       DEBUG (1,
   2023              "PR_SET_PTRACER defined"
   2024              " but could not determine ptrace scope from %s\n",
   2025              ptrace_scope_setting_file);
   2026    }
   2027    if (fd >= 0)
   2028       close (fd);
   2029 #  endif
   2030 
   2031 #  ifndef PTRACEINVOKER
   2032    fprintf(stderr,
   2033            "Note: ptrace invoker not implemented\n"
   2034            "For more info: read user manual section"
   2035            " 'Limitations of the Valgrind gdbserver'\n");
   2036 #  endif
   2037 }
   2038 
   2039 static
   2040 void usage(void)
   2041 {
   2042    fprintf(stderr,
   2043 "Usage: vgdb [OPTION]... [[-c] COMMAND]...\n"
   2044 "vgdb (valgrind gdb) has two usages\n"
   2045 "  1. standalone to send monitor commands to a Valgrind gdbserver.\n"
   2046 "     The OPTION(s) must be followed by the command to send\n"
   2047 "     To send more than one command, separate the commands with -c\n"
   2048 "  2. relay application between gdb and a Valgrind gdbserver.\n"
   2049 "     Only OPTION(s) can be given.\n"
   2050 "\n"
   2051 " OPTIONS are [--pid=<number>] [--vgdb-prefix=<prefix>]\n"
   2052 "             [--wait=<number>] [--max-invoke-ms=<number>]\n"
   2053 "             [--port=<portnr>\n"
   2054 "             [--cmd-time-out=<number>] [-l] [-D] [-d]\n"
   2055 "             \n"
   2056 "  --pid arg must be given if multiple Valgrind gdbservers are found.\n"
   2057 "  --vgdb-prefix arg must be given to both Valgrind and vgdb utility\n"
   2058 "      if you want to change the default prefix for the FIFOs communication\n"
   2059 "      between the Valgrind gdbserver and vgdb.\n"
   2060 "  --wait (default 0) tells vgdb to check during the specified number\n"
   2061 "      of seconds if a Valgrind gdbserver can be found.\n"
   2062 "  --max-invoke-ms (default 100) gives the nr of milli-seconds after which vgdb\n"
   2063 "      will force the invocation of the Valgrind gdbserver (if the Valgrind\n"
   2064 "         process is blocked in a system call).\n"
   2065 "  --port instructs vgdb to listen for gdb on the specified port nr.\n"
   2066 "  --cmd-time-out (default 99999999) tells vgdb to exit if the found Valgrind\n"
   2067 "     gdbserver has not processed a command after number seconds\n"
   2068 "  -l  arg tells to show the list of running Valgrind gdbserver and then exit.\n"
   2069 "  -D  arg tells to show shared mem status and then exit.\n"
   2070 "  -d  arg tells to show debug info. Multiple -d args for more debug info\n"
   2071 "\n"
   2072 "  -h --help shows this message\n"
   2073 "  To get help from the Valgrind gdbserver, use vgdb help\n"
   2074 "\n"
   2075            );
   2076    ptrace_restrictions_msg();
   2077 }
   2078 
   2079 /* If show_list, outputs on stdout the list of Valgrind processes with gdbserver activated.
   2080                  and then exits.
   2081 
   2082    else if arg_pid == -1, waits maximum check_trials seconds to discover
   2083    a valgrind pid appearing.
   2084 
   2085    Otherwise verify arg_pid is valid and corresponds to a Valgrind process
   2086    with gdbserver activated.
   2087 
   2088    Returns the pid to work with
   2089    or exits in case of error (e.g. no pid found corresponding to arg_pid */
   2090 
   2091 static
   2092 int search_arg_pid(int arg_pid, int check_trials, Bool show_list)
   2093 {
   2094    int i;
   2095    int pid = -1;
   2096 
   2097    if (arg_pid == 0 || arg_pid < -1) {
   2098       fprintf (stderr, "vgdb error: invalid pid %d given\n", arg_pid);
   2099       exit (1);
   2100    } else {
   2101       /* search for a matching named fifo.
   2102          If we have been given a pid, we will check that the matching FIFO is
   2103          there (or wait the nr of check_trials for this to appear).
   2104          If no pid has been given, then if we find only one FIFO,
   2105          we will use this to build the pid to use.
   2106          If we find multiple processes with valid FIFO, we report them and will
   2107          exit with an error. */
   2108       DIR *vgdb_dir;
   2109       char *vgdb_dir_name = vmalloc (strlen (vgdb_prefix) + 3);
   2110       struct dirent *f;
   2111       int is;
   2112       int nr_valid_pid = 0;
   2113       const char *suffix = "-from-vgdb-to-"; /* followed by pid */
   2114       char *vgdb_format = vmalloc (strlen(vgdb_prefix) + strlen(suffix) + 1);
   2115 
   2116       strcpy (vgdb_format, vgdb_prefix);
   2117       strcat (vgdb_format, suffix);
   2118 
   2119       strcpy (vgdb_dir_name, vgdb_prefix);
   2120 
   2121       for (is = strlen(vgdb_prefix) - 1; is >= 0; is--)
   2122          if (vgdb_dir_name[is] == '/') {
   2123             vgdb_dir_name[is+1] = '\0';
   2124             break;
   2125          }
   2126       if (strlen(vgdb_dir_name) == 0)
   2127          strcpy (vgdb_dir_name, "./");
   2128 
   2129       DEBUG(1, "searching pid in directory %s format %s\n",
   2130             vgdb_dir_name, vgdb_format);
   2131 
   2132       /* try to find FIFOs with valid pid.
   2133          On exit of the loop, pid is set to:
   2134          the last pid found if show_list (or -1 if no process was listed)
   2135          -1 if no FIFOs matching a running process is found
   2136          -2 if multiple FIFOs of running processes are found
   2137          otherwise it is set to the (only) pid found that can be debugged
   2138       */
   2139       for (i = 0; i < check_trials; i++) {
   2140          DEBUG(1, "check_trial %d \n", i);
   2141          if (i > 0)
   2142            /* wait one second before checking again */
   2143            sleep(1);
   2144 
   2145          vgdb_dir = opendir (vgdb_dir_name);
   2146          if (vgdb_dir == NULL)
   2147             XERROR (errno,
   2148                     "vgdb error: opening directory %s searching vgdb fifo\n",
   2149                     vgdb_dir_name);
   2150 
   2151          errno = 0; /* avoid complain if vgdb_dir is empty */
   2152          while ((f = readdir (vgdb_dir))) {
   2153             struct stat st;
   2154             char pathname[strlen(vgdb_dir_name) + strlen(f->d_name)];
   2155             char *wrongpid;
   2156             int newpid;
   2157 
   2158             strcpy (pathname, vgdb_dir_name);
   2159             strcat (pathname, f->d_name);
   2160             DEBUG(3, "trying %s\n", pathname);
   2161             if (stat (pathname, &st) != 0) {
   2162                if (debuglevel >= 3)
   2163                   ERROR (errno, "vgdb error: stat %s searching vgdb fifo\n",
   2164                          pathname);
   2165             } else if (S_ISFIFO (st.st_mode)) {
   2166                DEBUG(3, "trying %s\n", pathname);
   2167                if (strncmp (pathname, vgdb_format,
   2168                             strlen (vgdb_format)) == 0) {
   2169                   newpid = strtol(pathname + strlen (vgdb_format),
   2170                                   &wrongpid, 10);
   2171                   if (*wrongpid == '-' && newpid > 0
   2172                       && kill (newpid, 0) == 0) {
   2173                      nr_valid_pid++;
   2174                      if (show_list) {
   2175                         report_pid (newpid, /*on_stdout*/ True);
   2176                         pid = newpid;
   2177                      } else if (arg_pid != -1) {
   2178                         if (arg_pid == newpid) {
   2179                            pid = newpid;
   2180                         }
   2181                      } else if (nr_valid_pid > 1) {
   2182                         if (nr_valid_pid == 2) {
   2183                            fprintf
   2184                               (stderr,
   2185                                "no --pid= arg given"
   2186                                " and multiple valgrind pids found:\n");
   2187                            report_pid (pid, /*on_stdout*/ False);
   2188                         }
   2189                         pid = -2;
   2190                         report_pid (newpid, /*on_stdout*/ False);
   2191                      } else {
   2192                         pid = newpid;
   2193                      }
   2194                   }
   2195                }
   2196             }
   2197             errno = 0; /* avoid complain if at the end of vgdb_dir */
   2198          }
   2199          if (f == NULL && errno != 0)
   2200             XERROR (errno, "vgdb error: reading directory %s for vgdb fifo\n",
   2201                     vgdb_dir_name);
   2202 
   2203          closedir (vgdb_dir);
   2204          if (pid != -1)
   2205             break;
   2206       }
   2207 
   2208       free (vgdb_dir_name);
   2209       free (vgdb_format);
   2210    }
   2211 
   2212    if (show_list) {
   2213       exit (1);
   2214    } else if (pid == -1) {
   2215       if (arg_pid == -1)
   2216          fprintf (stderr, "vgdb error: no FIFO found and no pid given\n");
   2217       else
   2218          fprintf (stderr, "vgdb error: no FIFO found matching pid %d\n",
   2219                   arg_pid);
   2220       exit (1);
   2221    }
   2222    else if (pid == -2) {
   2223       /* no arg_pid given, multiple FIFOs found */
   2224       exit (1);
   2225    }
   2226    else {
   2227       return pid;
   2228    }
   2229 }
   2230 
   2231 /* return true if the numeric value of an option of the
   2232    form --xxxxxxxxx=<number> could properly be extracted
   2233    from arg. If True is returned, *value contains the
   2234    extracted value.*/
   2235 static
   2236 Bool numeric_val(char* arg, int *value)
   2237 {
   2238    const char *eq_pos = strchr(arg, '=');
   2239    char *wrong;
   2240    long long int long_value;
   2241 
   2242    if (eq_pos == NULL)
   2243       return False;
   2244 
   2245    long_value = strtoll(eq_pos+1, &wrong, 10);
   2246    if (long_value < 0 || long_value > INT_MAX)
   2247       return False;
   2248    if (*wrong)
   2249       return False;
   2250 
   2251    *value = (int) long_value;
   2252    return True;
   2253 }
   2254 
   2255 /* true if arg matches the provided option */
   2256 static
   2257 Bool is_opt(char* arg, char *option)
   2258 {
   2259    int option_len = strlen(option);
   2260    if (option[option_len-1] == '=')
   2261       return (0 == strncmp(option, arg, option_len));
   2262    else
   2263       return (0 == strcmp(option, arg));
   2264 }
   2265 
   2266 /* Parse command lines options. If error(s), exits.
   2267    Otherwise returns the options in *p_... args.
   2268    commands must be big enough for the commands extracted from argv.
   2269    On return, *p_last_command gives the position in commands where
   2270    the last command has been allocated (using vmalloc). */
   2271 static
   2272 void parse_options(int argc, char** argv,
   2273                    Bool *p_show_shared_mem,
   2274                    Bool *p_show_list,
   2275                    int *p_arg_pid,
   2276                    int *p_check_trials,
   2277                    int *p_port,
   2278                    int *p_last_command,
   2279                    char *commands[])
   2280 {
   2281    Bool show_shared_mem = False;
   2282    Bool show_list = False;
   2283    int arg_pid = -1;
   2284    int check_trials = 1;
   2285    int last_command = -1;
   2286    int int_port = 0;
   2287 
   2288    int i;
   2289    int arg_errors = 0;
   2290 
   2291    for (i = 1; i < argc; i++) {
   2292       if (is_opt(argv[i], "--help") || is_opt(argv[i], "-h")) {
   2293          usage();
   2294          exit(0);
   2295       } else if (is_opt(argv[i], "-d")) {
   2296          debuglevel++;
   2297       } else if (is_opt(argv[i], "-D")) {
   2298          show_shared_mem = True;
   2299       } else if (is_opt(argv[i], "-l")) {
   2300          show_list = True;
   2301       } else if (is_opt(argv[i], "--pid=")) {
   2302          int newpid;
   2303          if (!numeric_val(argv[i], &newpid)) {
   2304             fprintf (stderr, "invalid --pid argument %s\n", argv[i]);
   2305             arg_errors++;
   2306          } else if (arg_pid != -1) {
   2307             fprintf (stderr, "multiple --pid arguments given\n");
   2308             arg_errors++;
   2309          } else {
   2310             arg_pid = newpid;
   2311          }
   2312       } else if (is_opt(argv[i], "--wait=")) {
   2313          if (!numeric_val(argv[i], &check_trials)) {
   2314             fprintf (stderr, "invalid --wait argument %s\n", argv[i]);
   2315             arg_errors++;
   2316          }
   2317       } else if (is_opt(argv[i], "--max-invoke-ms=")) {
   2318          if (!numeric_val(argv[i], &max_invoke_ms)) {
   2319             fprintf (stderr, "invalid --max-invoke-ms argument %s\n", argv[i]);
   2320             arg_errors++;
   2321          }
   2322       } else if (is_opt(argv[i], "--cmd-time-out=")) {
   2323          if (!numeric_val(argv[i], &cmd_time_out)) {
   2324             fprintf (stderr, "invalid --cmd-time-out argument %s\n", argv[i]);
   2325             arg_errors++;
   2326          }
   2327       } else if (is_opt(argv[i], "--port=")) {
   2328          if (!numeric_val(argv[i], &int_port)) {
   2329             fprintf (stderr, "invalid --port argument %s\n", argv[i]);
   2330             arg_errors++;
   2331          }
   2332       } else if (is_opt(argv[i], "--vgdb-prefix=")) {
   2333          vgdb_prefix = argv[i] + 14;
   2334       } else if (is_opt(argv[i], "-c")) {
   2335          last_command++;
   2336          commands[last_command] = vmalloc (1);
   2337          commands[last_command][0] = '\0';
   2338       } else if (0 == strncmp(argv[i], "-", 1)) {
   2339          fprintf (stderr, "unknown or invalid argument %s\n", argv[i]);
   2340          arg_errors++;
   2341       } else {
   2342          int len;
   2343          if (last_command == -1) {
   2344             /* only one command, no -c command indicator */
   2345             last_command++;
   2346             commands[last_command] = vmalloc (1);
   2347             commands[last_command][0] = '\0';
   2348          }
   2349          len = strlen(commands[last_command]);
   2350          commands[last_command] = vrealloc (commands[last_command],
   2351                                             len + 1 + strlen(argv[i]) + 1);
   2352          if (len > 0)
   2353             strcat (commands[last_command], " ");
   2354          strcat (commands[last_command], argv[i]);
   2355          if (packet_len_for_command(commands[last_command]) > PBUFSIZ) {
   2356             fprintf (stderr, "command %s too long\n", commands[last_command]);
   2357             arg_errors++;
   2358          }
   2359 
   2360       }
   2361    }
   2362 
   2363    if (vgdb_prefix == NULL)
   2364       vgdb_prefix = vgdb_prefix_default();
   2365 
   2366    if (isatty(0)
   2367        && !show_shared_mem
   2368        && !show_list
   2369        && int_port == 0
   2370        && last_command == -1) {
   2371       arg_errors++;
   2372       fprintf (stderr,
   2373                "Using vgdb standalone implies to give -D or -l or a COMMAND\n");
   2374    }
   2375 
   2376    if (show_shared_mem && show_list) {
   2377       arg_errors++;
   2378       fprintf (stderr,
   2379                "Can't use both -D and -l options\n");
   2380    }
   2381 
   2382    if (max_invoke_ms > 0
   2383        && cmd_time_out != NEVER
   2384        && (cmd_time_out * 1000) <= max_invoke_ms) {
   2385       arg_errors++;
   2386       fprintf (stderr,
   2387                "--max-invoke-ms must be < --cmd-time-out * 1000\n");
   2388    }
   2389 
   2390    if (show_list && arg_pid != -1) {
   2391       arg_errors++;
   2392       fprintf (stderr,
   2393                "Can't use both --pid and -l options\n");
   2394    }
   2395 
   2396    if (int_port > 0 && last_command != -1) {
   2397       arg_errors++;
   2398       fprintf (stderr,
   2399                "Can't use --port to send commands\n");
   2400    }
   2401 
   2402    if (arg_errors > 0) {
   2403       fprintf (stderr, "args error. Try `vgdb --help` for more information\n");
   2404       exit(1);
   2405    }
   2406 
   2407    *p_show_shared_mem = show_shared_mem;
   2408    *p_show_list = show_list;
   2409    *p_arg_pid = arg_pid;
   2410    *p_check_trials = check_trials;
   2411    *p_port = int_port;
   2412    *p_last_command = last_command;
   2413 }
   2414 
   2415 int main(int argc, char** argv)
   2416 {
   2417    int i;
   2418    int pid;
   2419 
   2420    Bool show_shared_mem;
   2421    Bool show_list;
   2422    int arg_pid;
   2423    int check_trials;
   2424    int in_port;
   2425    int last_command;
   2426    char *commands[argc]; // we will never have more commands than args.
   2427 
   2428    parse_options(argc, argv,
   2429                  &show_shared_mem,
   2430                  &show_list,
   2431                  &arg_pid,
   2432                  &check_trials,
   2433                  &in_port,
   2434                  &last_command,
   2435                  commands);
   2436 
   2437    /* when we are working as a relay for gdb, handle some signals by
   2438       only reporting them (according to debug level). Also handle these
   2439       when ptrace will be used: vgdb must clean up the ptrace effect before
   2440       dying. */
   2441    if (max_invoke_ms > 0 || last_command == -1)
   2442       install_handlers();
   2443 
   2444    pid = search_arg_pid (arg_pid, check_trials, show_list);
   2445 
   2446    prepare_fifos_and_shared_mem(pid);
   2447 
   2448    if (in_port > 0)
   2449       wait_for_gdb_connect(in_port);
   2450 
   2451    if (show_shared_mem) {
   2452       fprintf(stderr,
   2453               "vgdb %d "
   2454               "written_by_vgdb %d "
   2455               "seen_by_valgrind %d\n"
   2456               "vgdb pid %d\n",
   2457               VS_vgdb_pid,
   2458               VS_written_by_vgdb,
   2459               VS_seen_by_valgrind,
   2460               VS_vgdb_pid);
   2461       exit (0);
   2462    }
   2463 
   2464    if (last_command >= 0) {
   2465       standalone_send_commands(pid, last_command, commands);
   2466    } else {
   2467       gdb_relay(pid);
   2468    }
   2469 
   2470 
   2471    free (from_gdb_to_pid);
   2472    free (to_gdb_from_pid);
   2473    free (shared_mem);
   2474 
   2475    for (i = 0; i <= last_command; i++)
   2476       free (commands[i]);
   2477    return 0;
   2478 }
   2479