gdb/copyright.py: Adapt after move of gnulib from gdb to toplevel
[deliverable/binutils-gdb.git] / gdb / linux-fork.c
CommitLineData
ac264b3b
MS
1/* GNU/Linux native-dependent code for debugging multiple forks.
2
42a4f53d 3 Copyright (C) 2005-2019 Free Software Foundation, Inc.
ac264b3b
MS
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
a9762ec7 9 the Free Software Foundation; either version 3 of the License, or
ac264b3b
MS
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
a9762ec7 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
ac264b3b
MS
19
20#include "defs.h"
5af949e3 21#include "arch-utils.h"
ac264b3b 22#include "inferior.h"
45741a9c 23#include "infrun.h"
ac264b3b
MS
24#include "regcache.h"
25#include "gdbcmd.h"
26#include "infcall.h"
3e3b026f 27#include "objfiles.h"
ac264b3b 28#include "linux-fork.h"
f973ed9c 29#include "linux-nat.h"
7a298875 30#include "gdbthread.h"
05cba821 31#include "source.h"
ac264b3b 32
5826e159 33#include "nat/gdb_ptrace.h"
268a13a5 34#include "gdbsupport/gdb_wait.h"
2978b111 35#include <dirent.h>
ac264b3b
MS
36#include <ctype.h>
37
06974e6c 38#include <list>
ac264b3b 39
ac264b3b
MS
40/* Fork list data structure: */
41struct fork_info
42{
06974e6c
PA
43 explicit fork_info (pid_t pid)
44 : ptid (pid, pid, 0)
45 {
46 }
47
48 ~fork_info ()
49 {
50 /* Notes on step-resume breakpoints: since this is a concern for
51 threads, let's convince ourselves that it's not a concern for
52 forks. There are two ways for a fork_info to be created.
53 First, by the checkpoint command, in which case we're at a gdb
54 prompt and there can't be any step-resume breakpoint. Second,
55 by a fork in the user program, in which case we *may* have
56 stepped into the fork call, but regardless of whether we follow
57 the parent or the child, we will return to the same place and
58 the step-resume breakpoint, if any, will take care of itself as
59 usual. And unlike threads, we do not save a private copy of
60 the step-resume breakpoint -- so we're OK. */
61
62 if (savedregs)
63 delete savedregs;
64 if (filepos)
65 xfree (filepos);
66 }
67
68 ptid_t ptid = null_ptid;
69 ptid_t parent_ptid = null_ptid;
70
71 /* Convenient handle (GDB fork id). */
72 int num = 0;
73
74 /* Convenient for info fork, saves having to actually switch
75 contexts. */
76 readonly_detached_regcache *savedregs = nullptr;
77
78 CORE_ADDR pc = 0;
79
06974e6c
PA
80 /* Set of open file descriptors' offsets. */
81 off_t *filepos = nullptr;
82
83 int maxfd = 0;
ac264b3b
MS
84};
85
06974e6c
PA
86static std::list<fork_info> fork_list;
87static int highest_fork_num;
88
ac264b3b
MS
89/* Fork list methods: */
90
3cb5bea9 91int
ac264b3b
MS
92forks_exist_p (void)
93{
06974e6c 94 return !fork_list.empty ();
ac264b3b
MS
95}
96
2f341b6e
PA
97/* Return the last fork in the list. */
98
99static struct fork_info *
100find_last_fork (void)
101{
06974e6c 102 if (fork_list.empty ())
2f341b6e
PA
103 return NULL;
104
06974e6c 105 return &fork_list.back ();
2f341b6e
PA
106}
107
06974e6c 108/* Return true iff there's one fork in the list. */
ac264b3b 109
06974e6c
PA
110static bool
111one_fork_p ()
ac264b3b 112{
06974e6c
PA
113 return (!fork_list.empty ()
114 && &fork_list.front () == &fork_list.back ());
72f31aea
PA
115}
116
117/* Add a new fork to the internal fork list. */
118
119void
120add_fork (pid_t pid)
121{
06974e6c 122 fork_list.emplace_back (pid);
2f341b6e 123
06974e6c
PA
124 if (one_fork_p ())
125 highest_fork_num = 0;
2f341b6e 126
06974e6c 127 fork_info *fp = &fork_list.back ();
72f31aea 128 fp->num = ++highest_fork_num;
ac264b3b
MS
129}
130
ac264b3b
MS
131static void
132delete_fork (ptid_t ptid)
133{
e99b03dc 134 linux_target->low_forget_process (ptid.pid ());
26cb8b7c 135
06974e6c
PA
136 for (auto it = fork_list.begin (); it != fork_list.end (); ++it)
137 if (it->ptid == ptid)
138 {
139 fork_list.erase (it);
ac264b3b 140
06974e6c
PA
141 /* Special case: if there is now only one process in the list,
142 and if it is (hopefully!) the current inferior_ptid, then
143 remove it, leaving the list empty -- we're now down to the
144 default case of debugging a single process. */
145 if (one_fork_p () && fork_list.front ().ptid == inferior_ptid)
146 {
147 /* Last fork -- delete from list and handle as solo
148 process (should be a safe recursion). */
149 delete_fork (inferior_ptid);
150 }
151 return;
152 }
ac264b3b
MS
153}
154
155/* Find a fork_info by matching PTID. */
156static struct fork_info *
157find_fork_ptid (ptid_t ptid)
158{
06974e6c
PA
159 for (fork_info &fi : fork_list)
160 if (fi.ptid == ptid)
161 return &fi;
ac264b3b
MS
162
163 return NULL;
164}
165
166/* Find a fork_info by matching ID. */
167static struct fork_info *
168find_fork_id (int num)
169{
06974e6c
PA
170 for (fork_info &fi : fork_list)
171 if (fi.num == num)
172 return &fi;
ac264b3b
MS
173
174 return NULL;
175}
176
177/* Find a fork_info by matching pid. */
178extern struct fork_info *
179find_fork_pid (pid_t pid)
180{
06974e6c
PA
181 for (fork_info &fi : fork_list)
182 if (pid == fi.ptid.pid ())
183 return &fi;
ac264b3b
MS
184
185 return NULL;
186}
187
188static ptid_t
189fork_id_to_ptid (int num)
190{
191 struct fork_info *fork = find_fork_id (num);
192 if (fork)
193 return fork->ptid;
194 else
f2907e49 195 return ptid_t (-1);
ac264b3b
MS
196}
197
ac264b3b
MS
198/* Fork list <-> gdb interface. */
199
3cb5bea9 200/* Utility function for fork_load/fork_save.
ac264b3b
MS
201 Calls lseek in the (current) inferior process. */
202
203static off_t
204call_lseek (int fd, off_t offset, int whence)
205{
206 char exp[80];
207
7022349d 208 snprintf (&exp[0], sizeof (exp), "(long) lseek (%d, %ld, %d)",
ac264b3b
MS
209 fd, (long) offset, whence);
210 return (off_t) parse_and_eval_long (&exp[0]);
211}
212
213/* Load infrun state for the fork PTID. */
214
215static void
216fork_load_infrun_state (struct fork_info *fp)
217{
218 extern void nullify_last_target_wait_ptid ();
219 int i;
220
2277426b 221 linux_nat_switch_fork (fp->ptid);
f973ed9c 222
b7e60d85 223 if (fp->savedregs)
fc5b8736 224 get_current_regcache ()->restore (fp->savedregs);
ac264b3b 225
791b663b
DJ
226 registers_changed ();
227 reinit_frame_cache ();
228
f2ffa92b
PA
229 inferior_thread ()->suspend.stop_pc
230 = regcache_read_pc (get_current_regcache ());
ac264b3b
MS
231 nullify_last_target_wait_ptid ();
232
233 /* Now restore the file positions of open file descriptors. */
234 if (fp->filepos)
235 {
236 for (i = 0; i <= fp->maxfd; i++)
237 if (fp->filepos[i] != (off_t) -1)
238 call_lseek (i, fp->filepos[i], SEEK_SET);
239 /* NOTE: I can get away with using SEEK_SET and SEEK_CUR because
240 this is native-only. If it ever has to be cross, we'll have
241 to rethink this. */
242 }
243}
244
b7e60d85 245/* Save infrun state for the fork FP. */
ac264b3b 246
2277426b 247static void
b7e60d85 248fork_save_infrun_state (struct fork_info *fp)
ac264b3b 249{
d8d2a3ee 250 char path[PATH_MAX];
ac264b3b
MS
251 struct dirent *de;
252 DIR *d;
253
254 if (fp->savedregs)
c0e383c6 255 delete fp->savedregs;
ac264b3b 256
daf6667d
YQ
257 fp->savedregs = new readonly_detached_regcache (*get_current_regcache ());
258 fp->pc = regcache_read_pc (get_current_regcache ());
ac264b3b 259
b7e60d85
PA
260 /* Now save the 'state' (file position) of all open file descriptors.
261 Unfortunately fork does not take care of that for us... */
262 snprintf (path, PATH_MAX, "/proc/%ld/fd", (long) fp->ptid.pid ());
263 if ((d = opendir (path)) != NULL)
ac264b3b 264 {
b7e60d85
PA
265 long tmp;
266
267 fp->maxfd = 0;
268 while ((de = readdir (d)) != NULL)
ac264b3b 269 {
b7e60d85
PA
270 /* Count open file descriptors (actually find highest
271 numbered). */
272 tmp = strtol (&de->d_name[0], NULL, 10);
273 if (fp->maxfd < tmp)
274 fp->maxfd = tmp;
ac264b3b 275 }
b7e60d85
PA
276 /* Allocate array of file positions. */
277 fp->filepos = XRESIZEVEC (off_t, fp->filepos, fp->maxfd + 1);
278
279 /* Initialize to -1 (invalid). */
280 for (tmp = 0; tmp <= fp->maxfd; tmp++)
281 fp->filepos[tmp] = -1;
282
283 /* Now find actual file positions. */
284 rewinddir (d);
285 while ((de = readdir (d)) != NULL)
286 if (isdigit (de->d_name[0]))
287 {
288 tmp = strtol (&de->d_name[0], NULL, 10);
289 fp->filepos[tmp] = call_lseek (tmp, 0, SEEK_CUR);
290 }
291 closedir (d);
ac264b3b
MS
292 }
293}
294
295/* Kill 'em all, let God sort 'em out... */
296
3cb5bea9 297void
ac264b3b
MS
298linux_fork_killall (void)
299{
300 /* Walk list and kill every pid. No need to treat the
301 current inferior_ptid as special (we do not return a
302 status for it) -- however any process may be a child
303 or a parent, so may get a SIGCHLD from a previously
304 killed child. Wait them all out. */
ac264b3b 305
06974e6c 306 for (fork_info &fi : fork_list)
56aac7e8 307 {
06974e6c
PA
308 pid_t pid = fi.ptid.pid ();
309 int status;
310 pid_t ret;
56aac7e8 311 do {
4c28f408
PA
312 /* Use SIGKILL instead of PTRACE_KILL because the former works even
313 if the thread is running, while the later doesn't. */
314 kill (pid, SIGKILL);
56aac7e8
MS
315 ret = waitpid (pid, &status, 0);
316 /* We might get a SIGCHLD instead of an exit status. This is
317 aggravated by the first kill above - a child has just
318 died. MVS comment cut-and-pasted from linux-nat. */
319 } while (ret == pid && WIFSTOPPED (status));
320 }
06974e6c
PA
321
322 /* Clear list, prepare to start fresh. */
323 fork_list.clear ();
ac264b3b
MS
324}
325
326/* The current inferior_ptid has exited, but there are other viable
327 forks to debug. Delete the exiting one and context-switch to the
328 first available. */
329
3cb5bea9 330void
ac264b3b
MS
331linux_fork_mourn_inferior (void)
332{
2f341b6e
PA
333 struct fork_info *last;
334 int status;
335
ac264b3b
MS
336 /* Wait just one more time to collect the inferior's exit status.
337 Do not check whether this succeeds though, since we may be
338 dealing with a process that we attached to. Such a process will
339 only report its exit status to its original parent. */
e99b03dc 340 waitpid (inferior_ptid.pid (), &status, 0);
ac264b3b
MS
341
342 /* OK, presumably inferior_ptid is the one who has exited.
343 We need to delete that one from the fork_list, and switch
344 to the next available fork. */
345 delete_fork (inferior_ptid);
791b663b
DJ
346
347 /* There should still be a fork - if there's only one left,
348 delete_fork won't remove it, because we haven't updated
349 inferior_ptid yet. */
06974e6c 350 gdb_assert (!fork_list.empty ());
791b663b 351
2f341b6e
PA
352 last = find_last_fork ();
353 fork_load_infrun_state (last);
791b663b 354 printf_filtered (_("[Switching to %s]\n"),
a068643d 355 target_pid_to_str (inferior_ptid).c_str ());
791b663b
DJ
356
357 /* If there's only one fork, switch back to non-fork mode. */
06974e6c 358 if (one_fork_p ())
791b663b 359 delete_fork (inferior_ptid);
ac264b3b
MS
360}
361
7a7d3353
PA
362/* The current inferior_ptid is being detached, but there are other
363 viable forks to debug. Detach and delete it and context-switch to
364 the first available. */
365
3cb5bea9 366void
6bd6f3b6 367linux_fork_detach (int from_tty)
7a7d3353
PA
368{
369 /* OK, inferior_ptid is the one we are detaching from. We need to
370 delete it from the fork_list, and switch to the next available
371 fork. */
372
e99b03dc 373 if (ptrace (PTRACE_DETACH, inferior_ptid.pid (), 0, 0))
a068643d
TT
374 error (_("Unable to detach %s"),
375 target_pid_to_str (inferior_ptid).c_str ());
7a7d3353
PA
376
377 delete_fork (inferior_ptid);
7a7d3353
PA
378
379 /* There should still be a fork - if there's only one left,
380 delete_fork won't remove it, because we haven't updated
381 inferior_ptid yet. */
06974e6c 382 gdb_assert (!fork_list.empty ());
7a7d3353 383
06974e6c 384 fork_load_infrun_state (&fork_list.front ());
7a7d3353
PA
385
386 if (from_tty)
387 printf_filtered (_("[Switching to %s]\n"),
a068643d 388 target_pid_to_str (inferior_ptid).c_str ());
7a7d3353
PA
389
390 /* If there's only one fork, switch back to non-fork mode. */
06974e6c 391 if (one_fork_p ())
7a7d3353
PA
392 delete_fork (inferior_ptid);
393}
394
a07c8880
AB
395/* Temporarily switch to the infrun state stored on the fork_info
396 identified by a given ptid_t. When this object goes out of scope,
397 restore the currently selected infrun state. */
7a298875 398
a07c8880
AB
399class scoped_switch_fork_info
400{
401public:
402 /* Switch to the infrun state held on the fork_info identified by
403 PPTID. If PPTID is the current inferior then no switch is done. */
1ef8573c 404 explicit scoped_switch_fork_info (ptid_t pptid)
a07c8880
AB
405 : m_oldfp (nullptr)
406 {
407 if (pptid != inferior_ptid)
408 {
409 struct fork_info *newfp = nullptr;
410
411 /* Switch to pptid. */
412 m_oldfp = find_fork_ptid (inferior_ptid);
413 gdb_assert (m_oldfp != nullptr);
414 newfp = find_fork_ptid (pptid);
415 gdb_assert (newfp != nullptr);
b7e60d85 416 fork_save_infrun_state (m_oldfp);
a07c8880
AB
417 remove_breakpoints ();
418 fork_load_infrun_state (newfp);
419 insert_breakpoints ();
420 }
421 }
422
423 /* Restore the previously selected infrun state. If the constructor
424 didn't need to switch states, then nothing is done here either. */
425 ~scoped_switch_fork_info ()
426 {
427 if (m_oldfp != nullptr)
428 {
429 /* Switch back to inferior_ptid. */
a70b8144 430 try
1ef8573c
AB
431 {
432 remove_breakpoints ();
433 fork_load_infrun_state (m_oldfp);
434 insert_breakpoints ();
435 }
230d2906 436 catch (const gdb_exception &ex)
1ef8573c
AB
437 {
438 warning (_("Couldn't restore checkpoint state in %s: %s"),
3d6e9d23
TT
439 target_pid_to_str (m_oldfp->ptid).c_str (),
440 ex.what ());
1ef8573c 441 }
a07c8880
AB
442 }
443 }
444
445 DISABLE_COPY_AND_ASSIGN (scoped_switch_fork_info);
446
447private:
448 /* The fork_info for the previously selected infrun state, or nullptr if
449 we were already in the desired state, and nothing needs to be
450 restored. */
451 struct fork_info *m_oldfp;
452};
7a298875
HZ
453
454static int
455inferior_call_waitpid (ptid_t pptid, int pid)
456{
457 struct objfile *waitpid_objf;
458 struct value *waitpid_fn = NULL;
7a298875
HZ
459 int ret = -1;
460
a07c8880 461 scoped_switch_fork_info switch_fork_info (pptid);
e17c9e56 462
7a298875 463 /* Get the waitpid_fn. */
3b7344d5 464 if (lookup_minimal_symbol ("waitpid", NULL, NULL).minsym != NULL)
7a298875 465 waitpid_fn = find_function_in_inferior ("waitpid", &waitpid_objf);
3b7344d5
TT
466 if (!waitpid_fn
467 && lookup_minimal_symbol ("_waitpid", NULL, NULL).minsym != NULL)
7a298875 468 waitpid_fn = find_function_in_inferior ("_waitpid", &waitpid_objf);
a07c8880
AB
469 if (waitpid_fn != nullptr)
470 {
471 struct gdbarch *gdbarch = get_current_arch ();
472 struct value *argv[3], *retv;
7a298875 473
a07c8880
AB
474 /* Get the argv. */
475 argv[0] = value_from_longest (builtin_type (gdbarch)->builtin_int, pid);
476 argv[1] = value_from_pointer (builtin_type (gdbarch)->builtin_data_ptr, 0);
477 argv[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0);
7a298875 478
a07c8880 479 retv = call_function_by_hand (waitpid_fn, NULL, argv);
7a298875 480
a07c8880
AB
481 if (value_as_long (retv) >= 0)
482 ret = 0;
483 }
7a298875 484
7a298875
HZ
485 return ret;
486}
487
ac264b3b
MS
488/* Fork list <-> user interface. */
489
490static void
5b64bf74 491delete_checkpoint_command (const char *args, int from_tty)
ac264b3b 492{
e17c9e56 493 ptid_t ptid, pptid;
7a298875 494 struct fork_info *fi;
ac264b3b
MS
495
496 if (!args || !*args)
2277426b 497 error (_("Requires argument (checkpoint id to delete)"));
ac264b3b
MS
498
499 ptid = fork_id_to_ptid (parse_and_eval_long (args));
d7e15655 500 if (ptid == minus_one_ptid)
2277426b 501 error (_("No such checkpoint id, %s"), args);
ac264b3b 502
d7e15655 503 if (ptid == inferior_ptid)
3cb5bea9
PA
504 error (_("\
505Please switch to another checkpoint before deleting the current one"));
ac264b3b 506
e99b03dc 507 if (ptrace (PTRACE_KILL, ptid.pid (), 0, 0))
a068643d 508 error (_("Unable to kill pid %s"), target_pid_to_str (ptid).c_str ());
ac264b3b 509
7a298875
HZ
510 fi = find_fork_ptid (ptid);
511 gdb_assert (fi);
e17c9e56 512 pptid = fi->parent_ptid;
7a298875 513
ac264b3b 514 if (from_tty)
a068643d 515 printf_filtered (_("Killed %s\n"), target_pid_to_str (ptid).c_str ());
ac264b3b
MS
516
517 delete_fork (ptid);
7a298875
HZ
518
519 /* If fi->parent_ptid is not a part of lwp but it's a part of checkpoint
520 list, waitpid the ptid.
00431a78 521 If fi->parent_ptid is a part of lwp and it is stopped, waitpid the
7a298875 522 ptid. */
00431a78
PA
523 thread_info *parent = find_thread_ptid (pptid);
524 if ((parent == NULL && find_fork_ptid (pptid))
525 || (parent != NULL && parent->state == THREAD_STOPPED))
7a298875 526 {
e99b03dc 527 if (inferior_call_waitpid (pptid, ptid.pid ()))
a068643d
TT
528 warning (_("Unable to wait pid %s"),
529 target_pid_to_str (ptid).c_str ());
7a298875 530 }
ac264b3b
MS
531}
532
533static void
5b64bf74 534detach_checkpoint_command (const char *args, int from_tty)
ac264b3b
MS
535{
536 ptid_t ptid;
537
538 if (!args || !*args)
2277426b 539 error (_("Requires argument (checkpoint id to detach)"));
ac264b3b
MS
540
541 ptid = fork_id_to_ptid (parse_and_eval_long (args));
d7e15655 542 if (ptid == minus_one_ptid)
2277426b 543 error (_("No such checkpoint id, %s"), args);
ac264b3b 544
d7e15655 545 if (ptid == inferior_ptid)
2277426b
PA
546 error (_("\
547Please switch to another checkpoint before detaching the current one"));
ac264b3b 548
e99b03dc 549 if (ptrace (PTRACE_DETACH, ptid.pid (), 0, 0))
a068643d 550 error (_("Unable to detach %s"), target_pid_to_str (ptid).c_str ());
ac264b3b
MS
551
552 if (from_tty)
a068643d 553 printf_filtered (_("Detached %s\n"), target_pid_to_str (ptid).c_str ());
ac264b3b
MS
554
555 delete_fork (ptid);
556}
557
3cb5bea9 558/* Print information about currently known checkpoints. */
ac264b3b
MS
559
560static void
1d12d88f 561info_checkpoints_command (const char *arg, int from_tty)
ac264b3b 562{
5af949e3 563 struct gdbarch *gdbarch = get_current_arch ();
b8db102d 564 int requested = -1;
06974e6c 565 const fork_info *printed = NULL;
b8db102d
MS
566
567 if (arg && *arg)
568 requested = (int) parse_and_eval_long (arg);
ac264b3b 569
06974e6c 570 for (const fork_info &fi : fork_list)
ac264b3b 571 {
06974e6c 572 if (requested > 0 && fi.num != requested)
b8db102d
MS
573 continue;
574
06974e6c
PA
575 printed = &fi;
576 if (fi.ptid == inferior_ptid)
daf6667d 577 printf_filtered ("* ");
ac264b3b 578 else
daf6667d
YQ
579 printf_filtered (" ");
580
06974e6c 581 ULONGEST pc = fi.pc;
a068643d 582 printf_filtered ("%d %s", fi.num, target_pid_to_str (fi.ptid).c_str ());
06974e6c 583 if (fi.num == 0)
ac264b3b
MS
584 printf_filtered (_(" (main process)"));
585 printf_filtered (_(" at "));
5af949e3 586 fputs_filtered (paddress (gdbarch, pc), gdb_stdout);
ac264b3b 587
06974e6c 588 symtab_and_line sal = find_pc_line (pc, 0);
ac264b3b 589 if (sal.symtab)
05cba821
JK
590 printf_filtered (_(", file %s"),
591 symtab_to_filename_for_display (sal.symtab));
ac264b3b
MS
592 if (sal.line)
593 printf_filtered (_(", line %d"), sal.line);
594 if (!sal.symtab && !sal.line)
595 {
7cbd4a93 596 struct bound_minimal_symbol msym;
ac264b3b
MS
597
598 msym = lookup_minimal_symbol_by_pc (pc);
7cbd4a93 599 if (msym.minsym)
c9d95fa3 600 printf_filtered (", <%s>", msym.minsym->linkage_name ());
ac264b3b
MS
601 }
602
603 putchar_filtered ('\n');
604 }
b8db102d
MS
605 if (printed == NULL)
606 {
607 if (requested > 0)
2277426b 608 printf_filtered (_("No checkpoint number %d.\n"), requested);
b8db102d 609 else
2277426b 610 printf_filtered (_("No checkpoints.\n"));
b8db102d 611 }
ac264b3b
MS
612}
613
2277426b
PA
614/* The PID of the process we're checkpointing. */
615static int checkpointing_pid = 0;
ac264b3b 616
2277426b
PA
617int
618linux_fork_checkpointing_p (int pid)
ac264b3b 619{
2277426b 620 return (checkpointing_pid == pid);
ac264b3b
MS
621}
622
92f6badc
KP
623/* Return true if the current inferior is multi-threaded. */
624
e52c971f
PA
625static bool
626inf_has_multiple_threads ()
92f6badc
KP
627{
628 int count = 0;
629
e52c971f
PA
630 /* Return true as soon as we see the second thread of the current
631 inferior. */
632 for (thread_info *tp ATTRIBUTE_UNUSED : current_inferior ()->threads ())
633 if (++count > 1)
634 return true;
635
636 return false;
92f6badc
KP
637}
638
ac264b3b 639static void
0b39b52e 640checkpoint_command (const char *args, int from_tty)
ac264b3b 641{
3e3b026f
UW
642 struct objfile *fork_objf;
643 struct gdbarch *gdbarch;
ac264b3b
MS
644 struct target_waitstatus last_target_waitstatus;
645 ptid_t last_target_ptid;
646 struct value *fork_fn = NULL, *ret;
647 struct fork_info *fp;
648 pid_t retpid;
74960c60 649
92f6badc
KP
650 if (!target_has_execution)
651 error (_("The program is not being run."));
652
653 /* Ensure that the inferior is not multithreaded. */
654 update_thread_list ();
655 if (inf_has_multiple_threads ())
656 error (_("checkpoint: can't checkpoint multiple threads."));
657
ac264b3b
MS
658 /* Make the inferior fork, record its (and gdb's) state. */
659
3b7344d5 660 if (lookup_minimal_symbol ("fork", NULL, NULL).minsym != NULL)
3e3b026f 661 fork_fn = find_function_in_inferior ("fork", &fork_objf);
ac264b3b 662 if (!fork_fn)
3b7344d5 663 if (lookup_minimal_symbol ("_fork", NULL, NULL).minsym != NULL)
3e3b026f 664 fork_fn = find_function_in_inferior ("fork", &fork_objf);
ac264b3b
MS
665 if (!fork_fn)
666 error (_("checkpoint: can't find fork function in inferior."));
667
3e3b026f
UW
668 gdbarch = get_objfile_arch (fork_objf);
669 ret = value_from_longest (builtin_type (gdbarch)->builtin_int, 0);
2277426b
PA
670
671 /* Tell linux-nat.c that we're checkpointing this inferior. */
b7b633e9
TT
672 {
673 scoped_restore save_pid
e99b03dc 674 = make_scoped_restore (&checkpointing_pid, inferior_ptid.pid ());
b7b633e9 675
e71585ff 676 ret = call_function_by_hand (fork_fn, NULL, {});
b7b633e9 677 }
2277426b 678
ac264b3b
MS
679 if (!ret) /* Probably can't happen. */
680 error (_("checkpoint: call_function_by_hand returned null."));
681
682 retpid = value_as_long (ret);
683 get_last_target_status (&last_target_ptid, &last_target_waitstatus);
6f9d33d8
PP
684
685 fp = find_fork_pid (retpid);
686
ac264b3b
MS
687 if (from_tty)
688 {
689 int parent_pid;
690
6f9d33d8
PP
691 printf_filtered (_("checkpoint %d: fork returned pid %ld.\n"),
692 fp != NULL ? fp->num : -1, (long) retpid);
ac264b3b
MS
693 if (info_verbose)
694 {
e38504b3 695 parent_pid = last_target_ptid.lwp ();
ac264b3b 696 if (parent_pid == 0)
e99b03dc 697 parent_pid = last_target_ptid.pid ();
3cb5bea9 698 printf_filtered (_(" gdb says parent = %ld.\n"),
ac264b3b
MS
699 (long) parent_pid);
700 }
701 }
702
ac264b3b
MS
703 if (!fp)
704 error (_("Failed to find new fork"));
72f31aea 705
06974e6c 706 if (one_fork_p ())
72f31aea
PA
707 {
708 /* Special case -- if this is the first fork in the list (the
709 list was hitherto empty), then add inferior_ptid first, as a
710 special zeroeth fork id. */
06974e6c 711 fork_list.emplace_front (inferior_ptid.pid ());
72f31aea
PA
712 }
713
b7e60d85 714 fork_save_infrun_state (fp);
7a298875 715 fp->parent_ptid = last_target_ptid;
ac264b3b
MS
716}
717
718static void
719linux_fork_context (struct fork_info *newfp, int from_tty)
720{
721 /* Now we attempt to switch processes. */
0d14fc63 722 struct fork_info *oldfp;
ac264b3b 723
0d14fc63 724 gdb_assert (newfp != NULL);
ac264b3b 725
0d14fc63
PA
726 oldfp = find_fork_ptid (inferior_ptid);
727 gdb_assert (oldfp != NULL);
ac264b3b 728
b7e60d85 729 fork_save_infrun_state (oldfp);
74960c60 730 remove_breakpoints ();
ac264b3b 731 fork_load_infrun_state (newfp);
74960c60 732 insert_breakpoints ();
ac264b3b 733
3cb5bea9 734 printf_filtered (_("Switching to %s\n"),
a068643d 735 target_pid_to_str (inferior_ptid).c_str ());
ac264b3b 736
08d72866 737 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
ac264b3b
MS
738}
739
2277426b 740/* Switch inferior process (checkpoint) context, by checkpoint id. */
ac264b3b 741static void
0b39b52e 742restart_command (const char *args, int from_tty)
ac264b3b
MS
743{
744 struct fork_info *fp;
745
746 if (!args || !*args)
747 error (_("Requires argument (checkpoint id to restart)"));
748
749 if ((fp = find_fork_id (parse_and_eval_long (args))) == NULL)
750 error (_("Not found: checkpoint id %s"), args);
751
752 linux_fork_context (fp, from_tty);
753}
754
755void
756_initialize_linux_fork (void)
757{
ac264b3b
MS
758 /* Checkpoint command: create a fork of the inferior process
759 and set it aside for later debugging. */
760
761 add_com ("checkpoint", class_obscure, checkpoint_command, _("\
762Fork a duplicate process (experimental)."));
763
2277426b
PA
764 /* Restart command: restore the context of a specified checkpoint
765 process. */
ac264b3b
MS
766
767 add_com ("restart", class_obscure, restart_command, _("\
590042fc
PW
768Restore program context from a checkpoint.\n\
769Usage: restart N\n\
c8a15b78 770Argument N is checkpoint ID, as displayed by 'info checkpoints'."));
ac264b3b 771
b8db102d 772 /* Delete checkpoint command: kill the process and remove it from
3cb5bea9 773 the fork list. */
ac264b3b 774
3cb5bea9 775 add_cmd ("checkpoint", class_obscure, delete_checkpoint_command, _("\
2277426b 776Delete a checkpoint (experimental)."),
b8db102d 777 &deletelist);
ac264b3b 778
3cb5bea9 779 /* Detach checkpoint command: release the process to run independently,
ac264b3b
MS
780 and remove it from the fork list. */
781
3cb5bea9 782 add_cmd ("checkpoint", class_obscure, detach_checkpoint_command, _("\
2277426b 783Detach from a checkpoint (experimental)."),
f73adfeb 784 &detachlist);
ac264b3b 785
3cb5bea9 786 /* Info checkpoints command: list all forks/checkpoints
ac264b3b
MS
787 currently under gdb's control. */
788
3cb5bea9 789 add_info ("checkpoints", info_checkpoints_command,
2277426b 790 _("IDs of currently known checkpoints."));
ac264b3b 791}
This page took 1.312981 seconds and 4 git commands to generate.