GDB (xrefs)
Loading...
Searching...
No Matches
fork-child.c
Go to the documentation of this file.
1/* Fork a Unix child process, and set up to debug it, for GDB.
2
3 Copyright (C) 1990-2023 Free Software Foundation, Inc.
4
5 Contributed by Cygnus Support.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21
22#include "defs.h"
23#include "inferior.h"
24#include "gdbcmd.h"
25#include "terminal.h"
26#include "gdbthread.h"
27#include "ui.h"
28#include "gdbsupport/job-control.h"
29#include "gdbsupport/filestuff.h"
30#include "nat/fork-inferior.h"
31#include "gdbsupport/common-inferior.h"
32
33/* The exec-wrapper, if any, that will be used when starting the
34 inferior. */
35
36static std::string exec_wrapper;
37
38/* See gdbsupport/common-inferior.h. */
39
40const char *
42{
43 return !exec_wrapper.empty () ? exec_wrapper.c_str () : nullptr;
44}
45
46/* See nat/fork-inferior.h. */
47
48void
54
55/* The ui structure that will be saved on 'prefork_hook' and
56 restored on 'postfork_hook'. */
57static struct ui *saved_ui = NULL;
58
59/* See nat/fork-inferior.h. */
60
61void
62prefork_hook (const char *args)
63{
64 gdb_assert (saved_ui == NULL);
65 /* Retain a copy of our UI, since the child will replace this value
66 and if we're vforked, we have to restore it. */
68
69 /* Tell the terminal handling subsystem what tty we plan to run on;
70 it will just record the information for later. */
72}
73
74/* See nat/fork-inferior.h. */
75
76void
78{
80
82
83 gdb_assert (saved_ui != NULL);
85 saved_ui = NULL;
86
88}
89
90/* See nat/fork-inferior.h. */
91
92void
94{
95 /* This is set to the result of setpgrp, which if vforked, will be
96 visible to you in the parent process. It's only used by humans
97 for debugging. */
98 static int debug_setpgrp = 657473;
99
100 /* Make sure we switch to main_ui here in order to be able to
101 use the gdb_printf/warning/error functions. */
103
104 /* Create a new session for the inferior process, if necessary.
105 It will also place the inferior in a separate process group. */
106 if (create_tty_session () <= 0)
107 {
108 /* No session was created, but we still want to run the inferior
109 in a separate process group. */
110 debug_setpgrp = gdb_setpgid ();
111 if (debug_setpgrp == -1)
112 perror (_("setpgrp failed in child"));
113 }
114
115 /* Ask the tty subsystem to switch to the one we specified
116 earlier (or to share the current terminal, if none was
117 specified). */
118 new_tty ();
119}
120
121/* See inferior.h. */
122
123ptid_t
124gdb_startup_inferior (pid_t pid, int num_traps)
125{
127 process_stratum_target *proc_target = inf->process_target ();
128
129 scoped_restore save_starting_up
130 = make_scoped_restore (&inf->starting_up, true);
131
132 ptid_t ptid = startup_inferior (proc_target, pid, num_traps, NULL, NULL);
133
134 /* Mark all threads non-executing. */
135 set_executing (proc_target, ptid, false);
136
137 return ptid;
138}
139
140/* Implement the "unset exec-wrapper" command. */
141
142static void
143unset_exec_wrapper_command (const char *args, int from_tty)
144{
145 exec_wrapper.clear ();
146}
147
148static void
149show_startup_with_shell (struct ui_file *file, int from_tty,
150 struct cmd_list_element *c, const char *value)
151{
152 gdb_printf (file,
153 _("Use of shell to start subprocesses is %s.\n"),
154 value);
155}
156
158void
160{
161 add_setshow_filename_cmd ("exec-wrapper", class_run, &exec_wrapper, _("\
162Set a wrapper for running programs.\n\
163The wrapper prepares the system and environment for the new program."),
164 _("\
165Show the wrapper for running programs."), NULL,
166 NULL, NULL,
167 &setlist, &showlist);
168
170 _("Disable use of an execution wrapper."),
171 &unsetlist);
172
173 add_setshow_boolean_cmd ("startup-with-shell", class_support,
174 &startup_with_shell, _("\
175Set use of shell to start subprocesses. The default is on."), _("\
176Show use of shell to start subprocesses."), NULL,
177 NULL,
179 &setlist, &showlist);
180}
struct cmd_list_element * showlist
Definition cli-cmds.c:127
struct cmd_list_element * setlist
Definition cli-cmds.c:119
struct cmd_list_element * unsetlist
Definition cli-cmds.c:123
set_show_commands add_setshow_filename_cmd(const char *name, enum command_class theclass, std::string *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
Definition cli-decode.c:855
struct cmd_list_element * add_cmd(const char *name, enum command_class theclass, const char *doc, struct cmd_list_element **list)
Definition cli-decode.c:233
set_show_commands add_setshow_boolean_cmd(const char *name, enum command_class theclass, bool *var, const char *set_doc, const char *show_doc, const char *help_doc, cmd_func_ftype *set_func, show_value_ftype *show_func, struct cmd_list_element **set_list, struct cmd_list_element **show_list)
Definition cli-decode.c:809
@ class_support
Definition command.h:58
@ class_run
Definition command.h:54
void _initialize_fork_child()
Definition fork-child.c:159
void prefork_hook(const char *args)
Definition fork-child.c:62
static void unset_exec_wrapper_command(const char *args, int from_tty)
Definition fork-child.c:143
const char * get_exec_wrapper()
Definition fork-child.c:41
static std::string exec_wrapper
Definition fork-child.c:36
void gdb_flush_out_err()
Definition fork-child.c:49
ptid_t gdb_startup_inferior(pid_t pid, int num_traps)
Definition fork-child.c:124
static struct ui * saved_ui
Definition fork-child.c:57
void postfork_child_hook()
Definition fork-child.c:93
void postfork_hook(pid_t pid)
Definition fork-child.c:77
static void show_startup_with_shell(struct ui_file *file, int from_tty, struct cmd_list_element *c, const char *value)
Definition fork-child.c:149
ptid_t startup_inferior(process_stratum_target *proc_target, pid_t pid, int ntraps, struct target_waitstatus *last_waitstatus, ptid_t *last_ptid)
void set_executing(process_stratum_target *targ, ptid_t ptid, bool executing)
Definition thread.c:908
mach_port_t mach_port_t name mach_port_t mach_port_t name kern_return_t int int rusage_t pid_t pid
Definition gnu-nat.c:1791
void inferior_appeared(struct inferior *inf, int pid)
Definition inferior.c:363
struct inferior * current_inferior(void)
Definition inferior.c:55
void new_tty_postfork(void)
Definition inflow.c:838
void new_tty_prefork(std::string ttyname)
Definition inflow.c:753
void new_tty(void)
Definition inflow.c:777
pid_t create_tty_session(void)
Definition inflow.c:899
Definition gnu-nat.c:153
Definition ui.h:55
struct ui_file * m_gdb_stdout
Definition ui.h:144
struct ui_file * m_gdb_stderr
Definition ui.h:148
Definition value.h:130
struct ui * main_ui
Definition ui.c:34
struct ui * current_ui
Definition ui.c:35
void gdb_printf(struct ui_file *stream, const char *format,...)
Definition utils.c:1886
void gdb_flush(struct ui_file *stream)
Definition utils.c:1498