xref: /openbsd-src/gnu/usr.bin/binutils/gdb/inftarg.c (revision b725ae7711052a2233e31a66fefb8a752c388d7a)
1 /* Target-vector operations for controlling Unix child processes, for GDB.
2 
3    Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999,
4    2000, 2002, 2003, 2004 Free Software Foundation, Inc.
5 
6    Contributed by Cygnus Support.
7 
8    ## Contains temporary hacks..
9 
10    This file is part of GDB.
11 
12    This program is free software; you can redistribute it and/or modify
13    it under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 2 of the License, or
15    (at your option) any later version.
16 
17    This program is distributed in the hope that it will be useful,
18    but WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20    GNU General Public License for more details.
21 
22    You should have received a copy of the GNU General Public License
23    along with this program; if not, write to the Free Software
24    Foundation, Inc., 59 Temple Place - Suite 330,
25    Boston, MA 02111-1307, USA.  */
26 
27 #include "defs.h"
28 #include "frame.h"		/* required by inferior.h */
29 #include "inferior.h"
30 #include "target.h"
31 #include "gdbcore.h"
32 #include "command.h"
33 #include "gdb_stat.h"
34 #include <signal.h>
35 #include <sys/types.h>
36 #include <fcntl.h>
37 
38 #include "gdb_wait.h"
39 #include "inflow.h"
40 
41 extern struct symtab_and_line *child_enable_exception_callback (enum
42 								exception_event_kind,
43 								int);
44 
45 extern struct exception_event_record
46   *child_get_current_exception_event (void);
47 
48 extern void _initialize_inftarg (void);
49 
50 static void child_prepare_to_store (void);
51 
52 #ifndef CHILD_WAIT
53 static ptid_t child_wait (ptid_t, struct target_waitstatus *);
54 #endif /* CHILD_WAIT */
55 
56 #if !defined(CHILD_POST_WAIT)
57 void child_post_wait (ptid_t, int);
58 #endif
59 
60 static void child_open (char *, int);
61 
62 static void child_files_info (struct target_ops *);
63 
64 static void child_detach (char *, int);
65 
66 static void child_attach (char *, int);
67 
68 #if !defined(CHILD_POST_ATTACH)
69 extern void child_post_attach (int);
70 #endif
71 
72 static void ptrace_me (void);
73 
74 static void ptrace_him (int);
75 
76 static void child_create_inferior (char *, char *, char **);
77 
78 static void child_mourn_inferior (void);
79 
80 static int child_can_run (void);
81 
82 static void child_stop (void);
83 
84 #ifndef CHILD_THREAD_ALIVE
85 int child_thread_alive (ptid_t);
86 #endif
87 
88 static void init_child_ops (void);
89 
90 extern char **environ;
91 
92 struct target_ops child_ops;
93 
94 int child_suppress_run = 0;	/* Non-zero if inftarg should pretend not to
95 				   be a runnable target.  Used by targets
96 				   that can sit atop inftarg, such as HPUX
97 				   thread support.  */
98 
99 #ifndef CHILD_WAIT
100 
101 /* Wait for child to do something.  Return pid of child, or -1 in case
102    of error; store status through argument pointer OURSTATUS.  */
103 
104 static ptid_t
105 child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
106 {
107   int save_errno;
108   int status;
109   char *execd_pathname = NULL;
110   int exit_status;
111   int related_pid;
112   int syscall_id;
113   enum target_waitkind kind;
114   int pid;
115 
116   do
117     {
118       set_sigint_trap ();	/* Causes SIGINT to be passed on to the
119 				   attached process. */
120       set_sigio_trap ();
121 
122       pid = ptrace_wait (inferior_ptid, &status);
123 
124       save_errno = errno;
125 
126       clear_sigio_trap ();
127 
128       clear_sigint_trap ();
129 
130       if (pid == -1)
131 	{
132 	  if (save_errno == EINTR)
133 	    continue;
134 
135 	  fprintf_unfiltered (gdb_stderr, "Child process unexpectedly missing: %s.\n",
136 			      safe_strerror (save_errno));
137 
138 	  /* Claim it exited with unknown signal.  */
139 	  ourstatus->kind = TARGET_WAITKIND_SIGNALLED;
140 	  ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
141 	  return pid_to_ptid (-1);
142 	}
143 
144       /* Did it exit?
145        */
146       if (target_has_exited (pid, status, &exit_status))
147 	{
148 	  /* ??rehrauer: For now, ignore this. */
149 	  continue;
150 	}
151 
152       if (!target_thread_alive (pid_to_ptid (pid)))
153 	{
154 	  ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
155 	  return pid_to_ptid (pid);
156 	}
157       } while (pid != PIDGET (inferior_ptid)); /* Some other child died or stopped */
158 
159   store_waitstatus (ourstatus, status);
160   return pid_to_ptid (pid);
161 }
162 #endif /* CHILD_WAIT */
163 
164 #if !defined(CHILD_POST_WAIT)
165 void
166 child_post_wait (ptid_t ptid, int wait_status)
167 {
168   /* This version of Unix doesn't require a meaningful "post wait"
169      operation.
170    */
171 }
172 #endif
173 
174 
175 #ifndef CHILD_THREAD_ALIVE
176 
177 /* Check to see if the given thread is alive.
178 
179    FIXME: Is kill() ever the right way to do this?  I doubt it, but
180    for now we're going to try and be compatable with the old thread
181    code.  */
182 int
183 child_thread_alive (ptid_t ptid)
184 {
185   pid_t pid = PIDGET (ptid);
186 
187   return (kill (pid, 0) != -1);
188 }
189 
190 #endif
191 
192 /* Attach to process PID, then initialize for debugging it.  */
193 
194 static void
195 child_attach (char *args, int from_tty)
196 {
197   if (!args)
198     error_no_arg ("process-id to attach");
199 
200 #ifndef ATTACH_DETACH
201   error ("Can't attach to a process on this machine.");
202 #else
203   {
204     char *exec_file;
205     int pid;
206     char *dummy;
207 
208     dummy = args;
209     pid = strtol (args, &dummy, 0);
210     /* Some targets don't set errno on errors, grrr! */
211     if ((pid == 0) && (args == dummy))
212       error ("Illegal process-id: %s\n", args);
213 
214     if (pid == getpid ())	/* Trying to masturbate? */
215       error ("I refuse to debug myself!");
216 
217     if (from_tty)
218       {
219 	exec_file = (char *) get_exec_file (0);
220 
221 	if (exec_file)
222 	  printf_unfiltered ("Attaching to program: %s, %s\n", exec_file,
223 			     target_pid_to_str (pid_to_ptid (pid)));
224 	else
225 	  printf_unfiltered ("Attaching to %s\n",
226 	                     target_pid_to_str (pid_to_ptid (pid)));
227 
228 	gdb_flush (gdb_stdout);
229       }
230 
231     attach (pid);
232 
233     inferior_ptid = pid_to_ptid (pid);
234     push_target (&child_ops);
235   }
236 #endif /* ATTACH_DETACH */
237 }
238 
239 #if !defined(CHILD_POST_ATTACH)
240 void
241 child_post_attach (int pid)
242 {
243   /* This version of Unix doesn't require a meaningful "post attach"
244      operation by a debugger.  */
245 }
246 #endif
247 
248 /* Take a program previously attached to and detaches it.
249    The program resumes execution and will no longer stop
250    on signals, etc.  We'd better not have left any breakpoints
251    in the program or it'll die when it hits one.  For this
252    to work, it may be necessary for the process to have been
253    previously attached.  It *might* work if the program was
254    started via the normal ptrace (PTRACE_TRACEME).  */
255 
256 static void
257 child_detach (char *args, int from_tty)
258 {
259 #ifdef ATTACH_DETACH
260   {
261     int siggnal = 0;
262     int pid = PIDGET (inferior_ptid);
263 
264     if (from_tty)
265       {
266 	char *exec_file = get_exec_file (0);
267 	if (exec_file == 0)
268 	  exec_file = "";
269 	printf_unfiltered ("Detaching from program: %s, %s\n", exec_file,
270 			   target_pid_to_str (pid_to_ptid (pid)));
271 	gdb_flush (gdb_stdout);
272       }
273     if (args)
274       siggnal = atoi (args);
275 
276     detach (siggnal);
277 
278     inferior_ptid = null_ptid;
279     unpush_target (&child_ops);
280   }
281 #else
282   error ("This version of Unix does not support detaching a process.");
283 #endif
284 }
285 
286 /* Get ready to modify the registers array.  On machines which store
287    individual registers, this doesn't need to do anything.  On machines
288    which store all the registers in one fell swoop, this makes sure
289    that registers contains all the registers from the program being
290    debugged.  */
291 
292 static void
293 child_prepare_to_store (void)
294 {
295 #ifdef CHILD_PREPARE_TO_STORE
296   CHILD_PREPARE_TO_STORE ();
297 #endif
298 }
299 
300 /* Print status information about what we're accessing.  */
301 
302 static void
303 child_files_info (struct target_ops *ignore)
304 {
305   printf_unfiltered ("\tUsing the running image of %s %s.\n",
306       attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
307 }
308 
309 static void
310 child_open (char *arg, int from_tty)
311 {
312   error ("Use the \"run\" command to start a Unix child process.");
313 }
314 
315 /* Stub function which causes the inferior that runs it, to be ptrace-able
316    by its parent process.  */
317 
318 static void
319 ptrace_me (void)
320 {
321   /* "Trace me, Dr. Memory!" */
322   call_ptrace (0, 0, (PTRACE_ARG3_TYPE) 0, 0);
323 }
324 
325 /* Stub function which causes the GDB that runs it, to start ptrace-ing
326    the child process.  */
327 
328 static void
329 ptrace_him (int pid)
330 {
331   push_target (&child_ops);
332 
333   /* On some targets, there must be some explicit synchronization
334      between the parent and child processes after the debugger
335      forks, and before the child execs the debuggee program.  This
336      call basically gives permission for the child to exec.
337    */
338 
339   target_acknowledge_created_inferior (pid);
340 
341   /* START_INFERIOR_TRAPS_EXPECTED is defined in inferior.h,
342    * and will be 1 or 2 depending on whether we're starting
343    * without or with a shell.
344    */
345   startup_inferior (START_INFERIOR_TRAPS_EXPECTED);
346 
347   /* On some targets, there must be some explicit actions taken after
348      the inferior has been started up.
349    */
350   target_post_startup_inferior (pid_to_ptid (pid));
351 }
352 
353 /* Start an inferior Unix child process and sets inferior_ptid to its pid.
354    EXEC_FILE is the file to run.
355    ALLARGS is a string containing the arguments to the program.
356    ENV is the environment vector to pass.  Errors reported with error().  */
357 
358 static void
359 child_create_inferior (char *exec_file, char *allargs, char **env)
360 {
361 #ifdef HPUXHPPA
362   fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, pre_fork_inferior, NULL);
363 #else
364   fork_inferior (exec_file, allargs, env, ptrace_me, ptrace_him, NULL, NULL);
365 #endif
366   /* We are at the first instruction we care about.  */
367   /* Pedal to the metal... */
368   proceed ((CORE_ADDR) -1, TARGET_SIGNAL_0, 0);
369 }
370 
371 #if !defined(CHILD_POST_STARTUP_INFERIOR)
372 void
373 child_post_startup_inferior (ptid_t ptid)
374 {
375   /* This version of Unix doesn't require a meaningful "post startup inferior"
376      operation by a debugger.
377    */
378 }
379 #endif
380 
381 #if !defined(CHILD_ACKNOWLEDGE_CREATED_INFERIOR)
382 void
383 child_acknowledge_created_inferior (int pid)
384 {
385   /* This version of Unix doesn't require a meaningful "acknowledge created inferior"
386      operation by a debugger.
387    */
388 }
389 #endif
390 
391 
392 #if !defined(CHILD_INSERT_FORK_CATCHPOINT)
393 int
394 child_insert_fork_catchpoint (int pid)
395 {
396   /* This version of Unix doesn't support notification of fork events.  */
397   return 0;
398 }
399 #endif
400 
401 #if !defined(CHILD_REMOVE_FORK_CATCHPOINT)
402 int
403 child_remove_fork_catchpoint (int pid)
404 {
405   /* This version of Unix doesn't support notification of fork events.  */
406   return 0;
407 }
408 #endif
409 
410 #if !defined(CHILD_INSERT_VFORK_CATCHPOINT)
411 int
412 child_insert_vfork_catchpoint (int pid)
413 {
414   /* This version of Unix doesn't support notification of vfork events.  */
415   return 0;
416 }
417 #endif
418 
419 #if !defined(CHILD_REMOVE_VFORK_CATCHPOINT)
420 int
421 child_remove_vfork_catchpoint (int pid)
422 {
423   /* This version of Unix doesn't support notification of vfork events.  */
424   return 0;
425 }
426 #endif
427 
428 #if !defined(CHILD_FOLLOW_FORK)
429 int
430 child_follow_fork (int follow_child)
431 {
432   /* This version of Unix doesn't support following fork or vfork events.  */
433   return 0;
434 }
435 #endif
436 
437 #if !defined(CHILD_INSERT_EXEC_CATCHPOINT)
438 int
439 child_insert_exec_catchpoint (int pid)
440 {
441   /* This version of Unix doesn't support notification of exec events.  */
442   return 0;
443 }
444 #endif
445 
446 #if !defined(CHILD_REMOVE_EXEC_CATCHPOINT)
447 int
448 child_remove_exec_catchpoint (int pid)
449 {
450   /* This version of Unix doesn't support notification of exec events.  */
451   return 0;
452 }
453 #endif
454 
455 #if !defined(CHILD_REPORTED_EXEC_EVENTS_PER_EXEC_CALL)
456 int
457 child_reported_exec_events_per_exec_call (void)
458 {
459   /* This version of Unix doesn't support notification of exec events.
460    */
461   return 1;
462 }
463 #endif
464 
465 #if !defined(CHILD_HAS_EXITED)
466 int
467 child_has_exited (int pid, int wait_status, int *exit_status)
468 {
469   if (WIFEXITED (wait_status))
470     {
471       *exit_status = WEXITSTATUS (wait_status);
472       return 1;
473     }
474 
475   if (WIFSIGNALED (wait_status))
476     {
477       *exit_status = 0;		/* ?? Don't know what else to say here. */
478       return 1;
479     }
480 
481   /* ?? Do we really need to consult the event state, too?  Assume the
482      wait_state alone suffices.
483    */
484   return 0;
485 }
486 #endif
487 
488 
489 static void
490 child_mourn_inferior (void)
491 {
492   unpush_target (&child_ops);
493   generic_mourn_inferior ();
494 }
495 
496 static int
497 child_can_run (void)
498 {
499   /* This variable is controlled by modules that sit atop inftarg that may layer
500      their own process structure atop that provided here.  hpux-thread.c does
501      this because of the Hpux user-mode level thread model.  */
502 
503   return !child_suppress_run;
504 }
505 
506 /* Send a SIGINT to the process group.  This acts just like the user typed a
507    ^C on the controlling terminal.
508 
509    XXX - This may not be correct for all systems.  Some may want to use
510    killpg() instead of kill (-pgrp). */
511 
512 static void
513 child_stop (void)
514 {
515   kill (-inferior_process_group, SIGINT);
516 }
517 
518 #if !defined(CHILD_ENABLE_EXCEPTION_CALLBACK)
519 struct symtab_and_line *
520 child_enable_exception_callback (enum exception_event_kind kind, int enable)
521 {
522   return (struct symtab_and_line *) NULL;
523 }
524 #endif
525 
526 #if !defined(CHILD_GET_CURRENT_EXCEPTION_EVENT)
527 struct exception_event_record *
528 child_get_current_exception_event (void)
529 {
530   return (struct exception_event_record *) NULL;
531 }
532 #endif
533 
534 
535 #if !defined(CHILD_PID_TO_EXEC_FILE)
536 char *
537 child_pid_to_exec_file (int pid)
538 {
539   /* This version of Unix doesn't support translation of a process ID
540      to the filename of the executable file.
541    */
542   return NULL;
543 }
544 #endif
545 
546 char *
547 child_core_file_to_sym_file (char *core)
548 {
549   /* The target stratum for a running executable need not support
550      this operation.
551    */
552   return NULL;
553 }
554 
555 /* Perform a partial transfer to/from the specified object.  For
556    memory transfers, fall back to the old memory xfer functions.  */
557 
558 static LONGEST
559 child_xfer_partial (struct target_ops *ops, enum target_object object,
560 		    const char *annex, void *readbuf,
561 		    const void *writebuf, ULONGEST offset, LONGEST len)
562 {
563   switch (object)
564     {
565     case TARGET_OBJECT_MEMORY:
566       if (readbuf)
567 	return child_xfer_memory (offset, readbuf, len, 0/*write*/,
568 				  NULL, ops);
569       if (writebuf)
570 	return child_xfer_memory (offset, readbuf, len, 1/*write*/,
571 				  NULL, ops);
572       return -1;
573 
574     case TARGET_OBJECT_UNWIND_TABLE:
575 #ifndef NATIVE_XFER_UNWIND_TABLE
576 #define NATIVE_XFER_UNWIND_TABLE(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
577 #endif
578       return NATIVE_XFER_UNWIND_TABLE (ops, object, annex, readbuf, writebuf,
579 				       offset, len);
580 
581     case TARGET_OBJECT_AUXV:
582 #ifndef NATIVE_XFER_AUXV
583 #define NATIVE_XFER_AUXV(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
584 #endif
585       return NATIVE_XFER_AUXV (ops, object, annex, readbuf, writebuf,
586 			       offset, len);
587 
588     case TARGET_OBJECT_WCOOKIE:
589 #ifndef NATIVE_XFER_WCOOKIE
590 #define NATIVE_XFER_WCOOKIE(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
591 #endif
592       return NATIVE_XFER_WCOOKIE (ops, object, annex, readbuf, writebuf,
593 				  offset, len);
594 
595     default:
596       return -1;
597     }
598 }
599 
600 #if !defined(CHILD_PID_TO_STR)
601 char *
602 child_pid_to_str (ptid_t ptid)
603 {
604   return normal_pid_to_str (ptid);
605 }
606 #endif
607 
608 static void
609 init_child_ops (void)
610 {
611   child_ops.to_shortname = "child";
612   child_ops.to_longname = "Unix child process";
613   child_ops.to_doc = "Unix child process (started by the \"run\" command).";
614   child_ops.to_open = child_open;
615   child_ops.to_attach = child_attach;
616   child_ops.to_post_attach = child_post_attach;
617   child_ops.to_detach = child_detach;
618   child_ops.to_resume = child_resume;
619   child_ops.to_wait = child_wait;
620   child_ops.to_post_wait = child_post_wait;
621   child_ops.to_fetch_registers = fetch_inferior_registers;
622   child_ops.to_store_registers = store_inferior_registers;
623   child_ops.to_prepare_to_store = child_prepare_to_store;
624   child_ops.to_xfer_memory = child_xfer_memory;
625   child_ops.to_xfer_partial = child_xfer_partial;
626   child_ops.to_files_info = child_files_info;
627   child_ops.to_insert_breakpoint = memory_insert_breakpoint;
628   child_ops.to_remove_breakpoint = memory_remove_breakpoint;
629   child_ops.to_terminal_init = terminal_init_inferior;
630   child_ops.to_terminal_inferior = terminal_inferior;
631   child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
632   child_ops.to_terminal_save_ours = terminal_save_ours;
633   child_ops.to_terminal_ours = terminal_ours;
634   child_ops.to_terminal_info = child_terminal_info;
635   child_ops.to_kill = kill_inferior;
636   child_ops.to_create_inferior = child_create_inferior;
637   child_ops.to_post_startup_inferior = child_post_startup_inferior;
638   child_ops.to_acknowledge_created_inferior = child_acknowledge_created_inferior;
639   child_ops.to_insert_fork_catchpoint = child_insert_fork_catchpoint;
640   child_ops.to_remove_fork_catchpoint = child_remove_fork_catchpoint;
641   child_ops.to_insert_vfork_catchpoint = child_insert_vfork_catchpoint;
642   child_ops.to_remove_vfork_catchpoint = child_remove_vfork_catchpoint;
643   child_ops.to_follow_fork = child_follow_fork;
644   child_ops.to_insert_exec_catchpoint = child_insert_exec_catchpoint;
645   child_ops.to_remove_exec_catchpoint = child_remove_exec_catchpoint;
646   child_ops.to_reported_exec_events_per_exec_call = child_reported_exec_events_per_exec_call;
647   child_ops.to_has_exited = child_has_exited;
648   child_ops.to_mourn_inferior = child_mourn_inferior;
649   child_ops.to_can_run = child_can_run;
650   child_ops.to_thread_alive = child_thread_alive;
651   child_ops.to_pid_to_str = child_pid_to_str;
652   child_ops.to_stop = child_stop;
653   child_ops.to_enable_exception_callback = child_enable_exception_callback;
654   child_ops.to_get_current_exception_event = child_get_current_exception_event;
655   child_ops.to_pid_to_exec_file = child_pid_to_exec_file;
656   child_ops.to_stratum = process_stratum;
657   child_ops.to_has_all_memory = 1;
658   child_ops.to_has_memory = 1;
659   child_ops.to_has_stack = 1;
660   child_ops.to_has_registers = 1;
661   child_ops.to_has_execution = 1;
662   child_ops.to_magic = OPS_MAGIC;
663 }
664 
665 /* Take over the 'find_mapped_memory' vector from inftarg.c. */
666 extern void
667 inftarg_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR,
668 						       unsigned long,
669 						       int, int, int,
670 						       void *),
671 					      void *))
672 {
673   child_ops.to_find_memory_regions = func;
674 }
675 
676 /* Take over the 'make_corefile_notes' vector from inftarg.c. */
677 extern void
678 inftarg_set_make_corefile_notes (char * (*func) (bfd *, int *))
679 {
680   child_ops.to_make_corefile_notes = func;
681 }
682 
683 void
684 _initialize_inftarg (void)
685 {
686 #ifdef HAVE_OPTIONAL_PROC_FS
687   char procname[32];
688   int fd;
689 
690   /* If we have an optional /proc filesystem (e.g. under OSF/1),
691      don't add ptrace support if we can access the running GDB via /proc.  */
692 #ifndef PROC_NAME_FMT
693 #define PROC_NAME_FMT "/proc/%05d"
694 #endif
695   sprintf (procname, PROC_NAME_FMT, getpid ());
696   fd = open (procname, O_RDONLY);
697   if (fd >= 0)
698     {
699       close (fd);
700       return;
701     }
702 #endif
703 
704   init_child_ops ();
705   add_target (&child_ops);
706 }
707