Home | History | Annotate | Download | only in coregrind
      1 
      2 /*--------------------------------------------------------------------*/
      3 /*--- Attaching a debugger.                           m_debugger.c ---*/
      4 /*--------------------------------------------------------------------*/
      5 
      6 /*
      7    This file is part of Valgrind, a dynamic binary instrumentation
      8    framework.
      9 
     10    Copyright (C) 2000-2010 Julian Seward
     11       jseward (at) acm.org
     12 
     13    This program is free software; you can redistribute it and/or
     14    modify it under the terms of the GNU General Public License as
     15    published by the Free Software Foundation; either version 2 of the
     16    License, or (at your option) any later version.
     17 
     18    This program is distributed in the hope that it will be useful, but
     19    WITHOUT ANY WARRANTY; without even the implied warranty of
     20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     21    General Public License for more details.
     22 
     23    You should have received a copy of the GNU General Public License
     24    along with this program; if not, write to the Free Software
     25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
     26    02111-1307, USA.
     27 
     28    The GNU General Public License is contained in the file COPYING.
     29 */
     30 
     31 #include "pub_core_basics.h"
     32 #include "pub_core_vki.h"
     33 #include "pub_core_threadstate.h"
     34 #include "pub_core_xarray.h"
     35 #include "pub_core_clientstate.h"
     36 #include "pub_core_debugger.h"
     37 #include "pub_core_libcbase.h"
     38 #include "pub_core_libcprint.h"
     39 #include "pub_core_libcproc.h"
     40 #include "pub_core_libcsignal.h"
     41 #include "pub_core_libcassert.h"
     42 #include "pub_core_options.h"
     43 
     44 
     45 #define WIFSTOPPED(status) (((status) & 0xff) == 0x7f)
     46 #define WSTOPSIG(status) (((status) & 0xff00) >> 8)
     47 
     48 static Int ptrace_setregs(Int pid, VexGuestArchState* vex)
     49 {
     50 #if defined(VGP_x86_linux)
     51    struct vki_user_regs_struct regs;
     52    VG_(memset)(&regs, 0, sizeof(regs));
     53    regs.cs     = vex->guest_CS;
     54    regs.ss     = vex->guest_SS;
     55    regs.ds     = vex->guest_DS;
     56    regs.es     = vex->guest_ES;
     57    regs.fs     = vex->guest_FS;
     58    regs.gs     = vex->guest_GS;
     59    regs.eax    = vex->guest_EAX;
     60    regs.ebx    = vex->guest_EBX;
     61    regs.ecx    = vex->guest_ECX;
     62    regs.edx    = vex->guest_EDX;
     63    regs.esi    = vex->guest_ESI;
     64    regs.edi    = vex->guest_EDI;
     65    regs.ebp    = vex->guest_EBP;
     66    regs.esp    = vex->guest_ESP;
     67    regs.eflags = LibVEX_GuestX86_get_eflags(vex);
     68    regs.eip    = vex->guest_EIP;
     69    return VG_(ptrace)(VKI_PTRACE_SETREGS, pid, NULL, &regs);
     70 
     71 #elif defined(VGP_amd64_linux)
     72    struct vki_user_regs_struct regs;
     73    VG_(memset)(&regs, 0, sizeof(regs));
     74    regs.rax    = vex->guest_RAX;
     75    regs.rbx    = vex->guest_RBX;
     76    regs.rcx    = vex->guest_RCX;
     77    regs.rdx    = vex->guest_RDX;
     78    regs.rsi    = vex->guest_RSI;
     79    regs.rdi    = vex->guest_RDI;
     80    regs.rbp    = vex->guest_RBP;
     81    regs.rsp    = vex->guest_RSP;
     82    regs.r8     = vex->guest_R8;
     83    regs.r9     = vex->guest_R9;
     84    regs.r10    = vex->guest_R10;
     85    regs.r11    = vex->guest_R11;
     86    regs.r12    = vex->guest_R12;
     87    regs.r13    = vex->guest_R13;
     88    regs.r14    = vex->guest_R14;
     89    regs.r15    = vex->guest_R15;
     90    regs.eflags = LibVEX_GuestAMD64_get_rflags(vex);
     91    regs.rip    = vex->guest_RIP;
     92    /* Set %{c,d,e,f,s,g}s and %{fs,gs}_base (whatever those are) to
     93       values which don't fail the kernel's sanity checks.  I have no
     94       idea what these should really be set to.  Anyway, mostly it
     95       seems that zero is an allowable value, except for %cs and %ss
     96       which have to have their lowest 2 bits be 11.  See putreg() in
     97       linux-2.6.23/arch/x86_64/kernel/ptrace.c for the apparently
     98       relevant sanity checks.  This fixes #145622. */
     99    regs.cs      = 3;
    100    regs.ds      = 0;
    101    regs.es      = 0;
    102    regs.fs      = 0;
    103    regs.ss      = 3;
    104    regs.gs      = 0;
    105    regs.fs_base = 0;
    106    regs.gs_base = 0;
    107    return VG_(ptrace)(VKI_PTRACE_SETREGS, pid, NULL, &regs);
    108 
    109 #elif defined(VGP_ppc32_linux)
    110    Int rc = 0;
    111    /* apparently the casting to void* is the Right Thing To Do */
    112    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R0  * 4), (void*)vex->guest_GPR0);
    113    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R1  * 4), (void*)vex->guest_GPR1);
    114    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R2  * 4), (void*)vex->guest_GPR2);
    115    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R3  * 4), (void*)vex->guest_GPR3);
    116    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R4  * 4), (void*)vex->guest_GPR4);
    117    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R5  * 4), (void*)vex->guest_GPR5);
    118    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R6  * 4), (void*)vex->guest_GPR6);
    119    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R7  * 4), (void*)vex->guest_GPR7);
    120    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R8  * 4), (void*)vex->guest_GPR8);
    121    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R9  * 4), (void*)vex->guest_GPR9);
    122    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R10 * 4), (void*)vex->guest_GPR10);
    123    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R11 * 4), (void*)vex->guest_GPR11);
    124    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R12 * 4), (void*)vex->guest_GPR12);
    125    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R13 * 4), (void*)vex->guest_GPR13);
    126    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R14 * 4), (void*)vex->guest_GPR14);
    127    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R15 * 4), (void*)vex->guest_GPR15);
    128    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R16 * 4), (void*)vex->guest_GPR16);
    129    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R17 * 4), (void*)vex->guest_GPR17);
    130    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R18 * 4), (void*)vex->guest_GPR18);
    131    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R19 * 4), (void*)vex->guest_GPR19);
    132    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R20 * 4), (void*)vex->guest_GPR20);
    133    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R21 * 4), (void*)vex->guest_GPR21);
    134    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R22 * 4), (void*)vex->guest_GPR22);
    135    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R23 * 4), (void*)vex->guest_GPR23);
    136    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R24 * 4), (void*)vex->guest_GPR24);
    137    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R25 * 4), (void*)vex->guest_GPR25);
    138    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R26 * 4), (void*)vex->guest_GPR26);
    139    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R27 * 4), (void*)vex->guest_GPR27);
    140    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R28 * 4), (void*)vex->guest_GPR28);
    141    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R29 * 4), (void*)vex->guest_GPR29);
    142    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R30 * 4), (void*)vex->guest_GPR30);
    143    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R31 * 4), (void*)vex->guest_GPR31);
    144    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_NIP * 4), (void*)vex->guest_CIA);
    145    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_CCR * 4),
    146                      (void*)LibVEX_GuestPPC32_get_CR(vex));
    147    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_LNK * 4), (void*)vex->guest_LR);
    148    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_CTR * 4), (void*)vex->guest_CTR);
    149    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_XER * 4),
    150                      (void*)LibVEX_GuestPPC32_get_XER(vex));
    151    return rc;
    152 
    153 #elif defined(VGP_ppc64_linux)
    154    Int rc = 0;
    155    /* FRJ: copied nearly verbatim from the ppc32 case. I compared the
    156       vki-ppc64-linux.h with its ppc32 counterpart and saw no
    157       appreciable differences, other than the registers being 8 bytes
    158       instead of 4. No idea why we don't set all of the entries
    159       declared in vki_pt_regs, but ppc32 doesn't so there must be a
    160       reason.
    161 
    162       Finally, note that CR and XER are 32 bits even for ppc64 (see
    163       libvex_guest_ppc64.h), but the vki_pt_regs struct still gives
    164       them 64 bits.
    165    */
    166    /* apparently the casting to void* is the Right Thing To Do */
    167    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R0  * 8), (void*)vex->guest_GPR0);
    168    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R1  * 8), (void*)vex->guest_GPR1);
    169    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R2  * 8), (void*)vex->guest_GPR2);
    170    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R3  * 8), (void*)vex->guest_GPR3);
    171    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R4  * 8), (void*)vex->guest_GPR4);
    172    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R5  * 8), (void*)vex->guest_GPR5);
    173    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R6  * 8), (void*)vex->guest_GPR6);
    174    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R7  * 8), (void*)vex->guest_GPR7);
    175    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R8  * 8), (void*)vex->guest_GPR8);
    176    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R9  * 8), (void*)vex->guest_GPR9);
    177    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R10 * 8), (void*)vex->guest_GPR10);
    178    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R11 * 8), (void*)vex->guest_GPR11);
    179    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R12 * 8), (void*)vex->guest_GPR12);
    180    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R13 * 8), (void*)vex->guest_GPR13);
    181    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R14 * 8), (void*)vex->guest_GPR14);
    182    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R15 * 8), (void*)vex->guest_GPR15);
    183    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R16 * 8), (void*)vex->guest_GPR16);
    184    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R17 * 8), (void*)vex->guest_GPR17);
    185    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R18 * 8), (void*)vex->guest_GPR18);
    186    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R19 * 8), (void*)vex->guest_GPR19);
    187    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R20 * 8), (void*)vex->guest_GPR20);
    188    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R21 * 8), (void*)vex->guest_GPR21);
    189    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R22 * 8), (void*)vex->guest_GPR22);
    190    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R23 * 8), (void*)vex->guest_GPR23);
    191    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R24 * 8), (void*)vex->guest_GPR24);
    192    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R25 * 8), (void*)vex->guest_GPR25);
    193    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R26 * 8), (void*)vex->guest_GPR26);
    194    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R27 * 8), (void*)vex->guest_GPR27);
    195    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R28 * 8), (void*)vex->guest_GPR28);
    196    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R29 * 8), (void*)vex->guest_GPR29);
    197    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R30 * 8), (void*)vex->guest_GPR30);
    198    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_R31 * 8), (void*)vex->guest_GPR31);
    199    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_NIP * 8), (void*)vex->guest_CIA);
    200    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_CCR * 8),
    201                                               (void*)(long)LibVEX_GuestPPC64_get_CR(vex));
    202    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_LNK * 8), (void*)vex->guest_LR);
    203    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_CTR * 8), (void*)vex->guest_CTR);
    204    rc |= VG_(ptrace)(VKI_PTRACE_POKEUSR, pid, (void*)(VKI_PT_XER * 8),
    205                                               (void*)(long)LibVEX_GuestPPC64_get_XER(vex));
    206    return rc;
    207 
    208 #elif defined(VGP_arm_linux)
    209    struct vki_user_regs_struct uregs;
    210    VG_(memset)(&uregs, 0, sizeof(uregs));
    211    uregs.ARM_r0   = vex->guest_R0;
    212    uregs.ARM_r1   = vex->guest_R1;
    213    uregs.ARM_r2   = vex->guest_R2;
    214    uregs.ARM_r3   = vex->guest_R3;
    215    uregs.ARM_r4   = vex->guest_R4;
    216    uregs.ARM_r5   = vex->guest_R5;
    217    uregs.ARM_r6   = vex->guest_R6;
    218    uregs.ARM_r7   = vex->guest_R7;
    219    uregs.ARM_r8   = vex->guest_R8;
    220    uregs.ARM_r9   = vex->guest_R9;
    221    uregs.ARM_r10  = vex->guest_R10;
    222    uregs.ARM_fp   = vex->guest_R11;
    223    uregs.ARM_ip   = vex->guest_R12;
    224    uregs.ARM_sp   = vex->guest_R13;
    225    uregs.ARM_lr   = vex->guest_R14;
    226    // Remove the T bit from the bottom of R15T.  It will get shipped
    227    // over in CPSR.T instead, since LibVEX_GuestARM_get_cpsr copies
    228    // it from R15T[0].
    229    uregs.ARM_pc   = vex->guest_R15T & 0xFFFFFFFE;
    230    uregs.ARM_cpsr = LibVEX_GuestARM_get_cpsr(vex);
    231    return VG_(ptrace)(VKI_PTRACE_SETREGS, pid, NULL, &uregs);
    232 
    233 #elif defined(VGP_ppc32_aix5)
    234    I_die_here;
    235 
    236 #elif defined(VGP_ppc64_aix5)
    237    I_die_here;
    238 
    239 #elif defined(VGP_x86_darwin)
    240    I_die_here;
    241 
    242 #elif defined(VGP_amd64_darwin)
    243    I_die_here;
    244 
    245 #else
    246 #  error Unknown arch
    247 #endif
    248 }
    249 
    250 /* Start debugger and get it to attach to this process.  Called if the
    251    user requests this service after an error has been shown, so she can
    252    poke around and look at parameters, memory, etc.  You can't
    253    meaningfully get the debugger to continue the program, though; to
    254    continue, quit the debugger.  */
    255 void VG_(start_debugger) ( ThreadId tid )
    256 {
    257 #  define N_BUF 4096
    258    Int pid, rc;
    259 
    260    pid = VG_(fork)();
    261 
    262    if (pid == 0) {
    263       /* child */
    264       rc = VG_(ptrace)(VKI_PTRACE_TRACEME, 0, NULL, NULL);
    265       vg_assert(rc == 0);
    266       rc = VG_(kill)(VG_(getpid)(), VKI_SIGSTOP);
    267       vg_assert(rc == 0);
    268 
    269    } else if (pid > 0) {
    270       /* parent */
    271       Int status;
    272       Int res;
    273 
    274       if ((res = VG_(waitpid)(pid, &status, 0)) == pid &&
    275           WIFSTOPPED(status) && WSTOPSIG(status) == VKI_SIGSTOP &&
    276           ptrace_setregs(pid, &(VG_(threads)[tid].arch.vex)) == 0 &&
    277           VG_(kill)(pid, VKI_SIGSTOP) == 0 &&
    278           VG_(ptrace)(VKI_PTRACE_DETACH, pid, NULL, 0) == 0)
    279       {
    280          Char pidbuf[15];
    281          Char file[50];
    282          Char buf[N_BUF];
    283          Char *bufptr;
    284          Char *cmdptr;
    285 
    286          VG_(sprintf)(pidbuf, "%d", pid);
    287          VG_(sprintf)(file, "/proc/%d/fd/%d", pid, VG_(cl_exec_fd));
    288 
    289          bufptr = buf;
    290          cmdptr = VG_(clo_db_command);
    291 
    292          while (*cmdptr) {
    293             /* each iteration can advance bufptr by at most the length
    294                of file[], so the following assertion is generously
    295                over-paranoid. */
    296             vg_assert(bufptr - buf < N_BUF-15-50-10/*paranoia*/);
    297             switch (*cmdptr) {
    298                case '%':
    299                   switch (*++cmdptr) {
    300                      case 'f':
    301                         VG_(memcpy)(bufptr, file, VG_(strlen)(file));
    302                         bufptr += VG_(strlen)(file);
    303                         cmdptr++;
    304                         break;
    305                      case 'p':
    306                         VG_(memcpy)(bufptr, pidbuf, VG_(strlen)(pidbuf));
    307                         bufptr += VG_(strlen)(pidbuf);
    308                         cmdptr++;
    309                         break;
    310                      default:
    311                         *bufptr++ = *cmdptr++;
    312                         break;
    313                   }
    314                   break;
    315                default:
    316                   *bufptr++ = *cmdptr++;
    317                   break;
    318             }
    319             vg_assert(bufptr - buf < N_BUF-15-50-10/*paranoia*/);
    320          }
    321 
    322          *bufptr++ = '\0';
    323 
    324          VG_(message)(Vg_UserMsg, "starting debugger with cmd: %s\n", buf);
    325          res = VG_(system)(buf);
    326          if (res == 0) {
    327             VG_(message)(Vg_UserMsg, "\n");
    328             VG_(message)(Vg_UserMsg,
    329                          "Debugger has detached.  Valgrind regains control."
    330                          "  We continue.\n");
    331          } else {
    332             VG_(message)(Vg_UserMsg,
    333                          "Warning: Debugger attach failed! (sys_system)\n");
    334             VG_(message)(Vg_UserMsg, "\n");
    335          }
    336       } else {
    337          VG_(message)(Vg_UserMsg,
    338                       "Warning: Debugger attach failed! (ptrace problem?)\n");
    339          VG_(message)(Vg_UserMsg, "\n");
    340       }
    341 
    342       VG_(kill)(pid, VKI_SIGKILL);
    343       VG_(waitpid)(pid, &status, 0);
    344    }
    345 #  undef N_BUF
    346 }
    347 
    348 
    349 
    350 /*--------------------------------------------------------------------*/
    351 /*--- end                                                          ---*/
    352 /*--------------------------------------------------------------------*/
    353