]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - contrib/gdb/gdb/inftarg.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / contrib / gdb / gdb / inftarg.c
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     case TARGET_OBJECT_DIRTY:
596 #ifndef NATIVE_XFER_DIRTY
597 #define NATIVE_XFER_DIRTY(OPS,OBJECT,ANNEX,WRITEBUF,READBUF,OFFSET,LEN) (-1)
598 #endif
599       return NATIVE_XFER_DIRTY (ops, object, annex, readbuf, writebuf,
600                                 offset, len);
601
602     default:
603       return -1;
604     }
605 }
606
607 #if !defined(CHILD_PID_TO_STR)
608 char *
609 child_pid_to_str (ptid_t ptid)
610 {
611   return normal_pid_to_str (ptid);
612 }
613 #endif
614
615 static void
616 init_child_ops (void)
617 {
618   child_ops.to_shortname = "child";
619   child_ops.to_longname = "Unix child process";
620   child_ops.to_doc = "Unix child process (started by the \"run\" command).";
621   child_ops.to_open = child_open;
622   child_ops.to_attach = child_attach;
623   child_ops.to_post_attach = child_post_attach;
624   child_ops.to_detach = child_detach;
625   child_ops.to_resume = child_resume;
626   child_ops.to_wait = child_wait;
627   child_ops.to_post_wait = child_post_wait;
628   child_ops.to_fetch_registers = fetch_inferior_registers;
629   child_ops.to_store_registers = store_inferior_registers;
630   child_ops.to_prepare_to_store = child_prepare_to_store;
631   child_ops.to_xfer_memory = child_xfer_memory;
632   child_ops.to_xfer_partial = child_xfer_partial;
633   child_ops.to_files_info = child_files_info;
634   child_ops.to_insert_breakpoint = memory_insert_breakpoint;
635   child_ops.to_remove_breakpoint = memory_remove_breakpoint;
636   child_ops.to_terminal_init = terminal_init_inferior;
637   child_ops.to_terminal_inferior = terminal_inferior;
638   child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
639   child_ops.to_terminal_save_ours = terminal_save_ours;
640   child_ops.to_terminal_ours = terminal_ours;
641   child_ops.to_terminal_info = child_terminal_info;
642   child_ops.to_kill = kill_inferior;
643   child_ops.to_create_inferior = child_create_inferior;
644   child_ops.to_post_startup_inferior = child_post_startup_inferior;
645   child_ops.to_acknowledge_created_inferior = child_acknowledge_created_inferior;
646   child_ops.to_insert_fork_catchpoint = child_insert_fork_catchpoint;
647   child_ops.to_remove_fork_catchpoint = child_remove_fork_catchpoint;
648   child_ops.to_insert_vfork_catchpoint = child_insert_vfork_catchpoint;
649   child_ops.to_remove_vfork_catchpoint = child_remove_vfork_catchpoint;
650   child_ops.to_follow_fork = child_follow_fork;
651   child_ops.to_insert_exec_catchpoint = child_insert_exec_catchpoint;
652   child_ops.to_remove_exec_catchpoint = child_remove_exec_catchpoint;
653   child_ops.to_reported_exec_events_per_exec_call = child_reported_exec_events_per_exec_call;
654   child_ops.to_has_exited = child_has_exited;
655   child_ops.to_mourn_inferior = child_mourn_inferior;
656   child_ops.to_can_run = child_can_run;
657   child_ops.to_thread_alive = child_thread_alive;
658   child_ops.to_pid_to_str = child_pid_to_str;
659   child_ops.to_stop = child_stop;
660   child_ops.to_enable_exception_callback = child_enable_exception_callback;
661   child_ops.to_get_current_exception_event = child_get_current_exception_event;
662   child_ops.to_pid_to_exec_file = child_pid_to_exec_file;
663   child_ops.to_stratum = process_stratum;
664   child_ops.to_has_all_memory = 1;
665   child_ops.to_has_memory = 1;
666   child_ops.to_has_stack = 1;
667   child_ops.to_has_registers = 1;
668   child_ops.to_has_execution = 1;
669   child_ops.to_magic = OPS_MAGIC;
670 }
671
672 /* Take over the 'find_mapped_memory' vector from inftarg.c. */
673 extern void
674 inftarg_set_find_memory_regions (int (*func) (int (*) (CORE_ADDR,
675                                                        unsigned long,
676                                                        int, int, int,
677                                                        void *),
678                                               void *))
679 {
680   child_ops.to_find_memory_regions = func;
681 }
682
683 /* Take over the 'make_corefile_notes' vector from inftarg.c. */
684 extern void
685 inftarg_set_make_corefile_notes (char * (*func) (bfd *, int *))
686 {
687   child_ops.to_make_corefile_notes = func;
688 }
689
690 void
691 _initialize_inftarg (void)
692 {
693 #ifdef HAVE_OPTIONAL_PROC_FS
694   char procname[32];
695   int fd;
696
697   /* If we have an optional /proc filesystem (e.g. under OSF/1),
698      don't add ptrace support if we can access the running GDB via /proc.  */
699 #ifndef PROC_NAME_FMT
700 #define PROC_NAME_FMT "/proc/%05d"
701 #endif
702   sprintf (procname, PROC_NAME_FMT, getpid ());
703   fd = open (procname, O_RDONLY);
704   if (fd >= 0)
705     {
706       close (fd);
707       return;
708     }
709 #endif
710
711   init_child_ops ();
712   add_target (&child_ops);
713 }