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@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
48static 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.  */
255void 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