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