Eliminate fork_info::clobber_regs
[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"
0747795c 34#include "common/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
DJ
354 printf_filtered (_("[Switching to %s]\n"),
355 target_pid_to_str (inferior_ptid));
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))
7a7d3353
PA
374 error (_("Unable to detach %s"), target_pid_to_str (inferior_ptid));
375
376 delete_fork (inferior_ptid);
7a7d3353
PA
377
378 /* There should still be a fork - if there's only one left,
379 delete_fork won't remove it, because we haven't updated
380 inferior_ptid yet. */
06974e6c 381 gdb_assert (!fork_list.empty ());
7a7d3353 382
06974e6c 383 fork_load_infrun_state (&fork_list.front ());
7a7d3353
PA
384
385 if (from_tty)
386 printf_filtered (_("[Switching to %s]\n"),
387 target_pid_to_str (inferior_ptid));
388
389 /* If there's only one fork, switch back to non-fork mode. */
06974e6c 390 if (one_fork_p ())
7a7d3353
PA
391 delete_fork (inferior_ptid);
392}
393
a07c8880
AB
394/* Temporarily switch to the infrun state stored on the fork_info
395 identified by a given ptid_t. When this object goes out of scope,
396 restore the currently selected infrun state. */
7a298875 397
a07c8880
AB
398class scoped_switch_fork_info
399{
400public:
401 /* Switch to the infrun state held on the fork_info identified by
402 PPTID. If PPTID is the current inferior then no switch is done. */
1ef8573c 403 explicit scoped_switch_fork_info (ptid_t pptid)
a07c8880
AB
404 : m_oldfp (nullptr)
405 {
406 if (pptid != inferior_ptid)
407 {
408 struct fork_info *newfp = nullptr;
409
410 /* Switch to pptid. */
411 m_oldfp = find_fork_ptid (inferior_ptid);
412 gdb_assert (m_oldfp != nullptr);
413 newfp = find_fork_ptid (pptid);
414 gdb_assert (newfp != nullptr);
b7e60d85 415 fork_save_infrun_state (m_oldfp);
a07c8880
AB
416 remove_breakpoints ();
417 fork_load_infrun_state (newfp);
418 insert_breakpoints ();
419 }
420 }
421
422 /* Restore the previously selected infrun state. If the constructor
423 didn't need to switch states, then nothing is done here either. */
424 ~scoped_switch_fork_info ()
425 {
426 if (m_oldfp != nullptr)
427 {
428 /* Switch back to inferior_ptid. */
1ef8573c
AB
429 TRY
430 {
431 remove_breakpoints ();
432 fork_load_infrun_state (m_oldfp);
433 insert_breakpoints ();
434 }
435 CATCH (ex, RETURN_MASK_ALL)
436 {
437 warning (_("Couldn't restore checkpoint state in %s: %s"),
da584958 438 target_pid_to_str (m_oldfp->ptid), ex.message);
1ef8573c
AB
439 }
440 END_CATCH
a07c8880
AB
441 }
442 }
443
444 DISABLE_COPY_AND_ASSIGN (scoped_switch_fork_info);
445
446private:
447 /* The fork_info for the previously selected infrun state, or nullptr if
448 we were already in the desired state, and nothing needs to be
449 restored. */
450 struct fork_info *m_oldfp;
451};
7a298875
HZ
452
453static int
454inferior_call_waitpid (ptid_t pptid, int pid)
455{
456 struct objfile *waitpid_objf;
457 struct value *waitpid_fn = NULL;
7a298875
HZ
458 int ret = -1;
459
a07c8880 460 scoped_switch_fork_info switch_fork_info (pptid);
e17c9e56 461
7a298875 462 /* Get the waitpid_fn. */
3b7344d5 463 if (lookup_minimal_symbol ("waitpid", NULL, NULL).minsym != NULL)
7a298875 464 waitpid_fn = find_function_in_inferior ("waitpid", &waitpid_objf);
3b7344d5
TT
465 if (!waitpid_fn
466 && lookup_minimal_symbol ("_waitpid", NULL, NULL).minsym != NULL)
7a298875 467 waitpid_fn = find_function_in_inferior ("_waitpid", &waitpid_objf);
a07c8880
AB
468 if (waitpid_fn != nullptr)
469 {
470 struct gdbarch *gdbarch = get_current_arch ();
471 struct value *argv[3], *retv;
7a298875 472
a07c8880
AB
473 /* Get the argv. */
474 argv[0] = value_from_longest (builtin_type (gdbarch)->builtin_int, pid);
475 argv[1] = value_from_pointer (builtin_type (gdbarch)->builtin_data_ptr, 0);
476 argv[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0);
7a298875 477
a07c8880 478 retv = call_function_by_hand (waitpid_fn, NULL, argv);
7a298875 479
a07c8880
AB
480 if (value_as_long (retv) >= 0)
481 ret = 0;
482 }
7a298875 483
7a298875
HZ
484 return ret;
485}
486
ac264b3b
MS
487/* Fork list <-> user interface. */
488
489static void
5b64bf74 490delete_checkpoint_command (const char *args, int from_tty)
ac264b3b 491{
e17c9e56 492 ptid_t ptid, pptid;
7a298875 493 struct fork_info *fi;
ac264b3b
MS
494
495 if (!args || !*args)
2277426b 496 error (_("Requires argument (checkpoint id to delete)"));
ac264b3b
MS
497
498 ptid = fork_id_to_ptid (parse_and_eval_long (args));
d7e15655 499 if (ptid == minus_one_ptid)
2277426b 500 error (_("No such checkpoint id, %s"), args);
ac264b3b 501
d7e15655 502 if (ptid == inferior_ptid)
3cb5bea9
PA
503 error (_("\
504Please switch to another checkpoint before deleting the current one"));
ac264b3b 505
e99b03dc 506 if (ptrace (PTRACE_KILL, ptid.pid (), 0, 0))
54ba13f7 507 error (_("Unable to kill pid %s"), target_pid_to_str (ptid));
ac264b3b 508
7a298875
HZ
509 fi = find_fork_ptid (ptid);
510 gdb_assert (fi);
e17c9e56 511 pptid = fi->parent_ptid;
7a298875 512
ac264b3b
MS
513 if (from_tty)
514 printf_filtered (_("Killed %s\n"), target_pid_to_str (ptid));
515
516 delete_fork (ptid);
7a298875
HZ
517
518 /* If fi->parent_ptid is not a part of lwp but it's a part of checkpoint
519 list, waitpid the ptid.
00431a78 520 If fi->parent_ptid is a part of lwp and it is stopped, waitpid the
7a298875 521 ptid. */
00431a78
PA
522 thread_info *parent = find_thread_ptid (pptid);
523 if ((parent == NULL && find_fork_ptid (pptid))
524 || (parent != NULL && parent->state == THREAD_STOPPED))
7a298875 525 {
e99b03dc 526 if (inferior_call_waitpid (pptid, ptid.pid ()))
7a298875
HZ
527 warning (_("Unable to wait pid %s"), target_pid_to_str (ptid));
528 }
ac264b3b
MS
529}
530
531static void
5b64bf74 532detach_checkpoint_command (const char *args, int from_tty)
ac264b3b
MS
533{
534 ptid_t ptid;
535
536 if (!args || !*args)
2277426b 537 error (_("Requires argument (checkpoint id to detach)"));
ac264b3b
MS
538
539 ptid = fork_id_to_ptid (parse_and_eval_long (args));
d7e15655 540 if (ptid == minus_one_ptid)
2277426b 541 error (_("No such checkpoint id, %s"), args);
ac264b3b 542
d7e15655 543 if (ptid == inferior_ptid)
2277426b
PA
544 error (_("\
545Please switch to another checkpoint before detaching the current one"));
ac264b3b 546
e99b03dc 547 if (ptrace (PTRACE_DETACH, ptid.pid (), 0, 0))
ac264b3b
MS
548 error (_("Unable to detach %s"), target_pid_to_str (ptid));
549
550 if (from_tty)
551 printf_filtered (_("Detached %s\n"), target_pid_to_str (ptid));
552
553 delete_fork (ptid);
554}
555
3cb5bea9 556/* Print information about currently known checkpoints. */
ac264b3b
MS
557
558static void
1d12d88f 559info_checkpoints_command (const char *arg, int from_tty)
ac264b3b 560{
5af949e3 561 struct gdbarch *gdbarch = get_current_arch ();
b8db102d 562 int requested = -1;
06974e6c 563 const fork_info *printed = NULL;
b8db102d
MS
564
565 if (arg && *arg)
566 requested = (int) parse_and_eval_long (arg);
ac264b3b 567
06974e6c 568 for (const fork_info &fi : fork_list)
ac264b3b 569 {
06974e6c 570 if (requested > 0 && fi.num != requested)
b8db102d
MS
571 continue;
572
06974e6c
PA
573 printed = &fi;
574 if (fi.ptid == inferior_ptid)
daf6667d 575 printf_filtered ("* ");
ac264b3b 576 else
daf6667d
YQ
577 printf_filtered (" ");
578
06974e6c
PA
579 ULONGEST pc = fi.pc;
580 printf_filtered ("%d %s", fi.num, target_pid_to_str (fi.ptid));
581 if (fi.num == 0)
ac264b3b
MS
582 printf_filtered (_(" (main process)"));
583 printf_filtered (_(" at "));
5af949e3 584 fputs_filtered (paddress (gdbarch, pc), gdb_stdout);
ac264b3b 585
06974e6c 586 symtab_and_line sal = find_pc_line (pc, 0);
ac264b3b 587 if (sal.symtab)
05cba821
JK
588 printf_filtered (_(", file %s"),
589 symtab_to_filename_for_display (sal.symtab));
ac264b3b
MS
590 if (sal.line)
591 printf_filtered (_(", line %d"), sal.line);
592 if (!sal.symtab && !sal.line)
593 {
7cbd4a93 594 struct bound_minimal_symbol msym;
ac264b3b
MS
595
596 msym = lookup_minimal_symbol_by_pc (pc);
7cbd4a93 597 if (msym.minsym)
efd66ac6 598 printf_filtered (", <%s>", MSYMBOL_LINKAGE_NAME (msym.minsym));
ac264b3b
MS
599 }
600
601 putchar_filtered ('\n');
602 }
b8db102d
MS
603 if (printed == NULL)
604 {
605 if (requested > 0)
2277426b 606 printf_filtered (_("No checkpoint number %d.\n"), requested);
b8db102d 607 else
2277426b 608 printf_filtered (_("No checkpoints.\n"));
b8db102d 609 }
ac264b3b
MS
610}
611
2277426b
PA
612/* The PID of the process we're checkpointing. */
613static int checkpointing_pid = 0;
ac264b3b 614
2277426b
PA
615int
616linux_fork_checkpointing_p (int pid)
ac264b3b 617{
2277426b 618 return (checkpointing_pid == pid);
ac264b3b
MS
619}
620
92f6badc
KP
621/* Return true if the current inferior is multi-threaded. */
622
e52c971f
PA
623static bool
624inf_has_multiple_threads ()
92f6badc
KP
625{
626 int count = 0;
627
e52c971f
PA
628 /* Return true as soon as we see the second thread of the current
629 inferior. */
630 for (thread_info *tp ATTRIBUTE_UNUSED : current_inferior ()->threads ())
631 if (++count > 1)
632 return true;
633
634 return false;
92f6badc
KP
635}
636
ac264b3b 637static void
0b39b52e 638checkpoint_command (const char *args, int from_tty)
ac264b3b 639{
3e3b026f
UW
640 struct objfile *fork_objf;
641 struct gdbarch *gdbarch;
ac264b3b
MS
642 struct target_waitstatus last_target_waitstatus;
643 ptid_t last_target_ptid;
644 struct value *fork_fn = NULL, *ret;
645 struct fork_info *fp;
646 pid_t retpid;
74960c60 647
92f6badc
KP
648 if (!target_has_execution)
649 error (_("The program is not being run."));
650
651 /* Ensure that the inferior is not multithreaded. */
652 update_thread_list ();
653 if (inf_has_multiple_threads ())
654 error (_("checkpoint: can't checkpoint multiple threads."));
655
ac264b3b
MS
656 /* Make the inferior fork, record its (and gdb's) state. */
657
3b7344d5 658 if (lookup_minimal_symbol ("fork", NULL, NULL).minsym != NULL)
3e3b026f 659 fork_fn = find_function_in_inferior ("fork", &fork_objf);
ac264b3b 660 if (!fork_fn)
3b7344d5 661 if (lookup_minimal_symbol ("_fork", NULL, NULL).minsym != NULL)
3e3b026f 662 fork_fn = find_function_in_inferior ("fork", &fork_objf);
ac264b3b
MS
663 if (!fork_fn)
664 error (_("checkpoint: can't find fork function in inferior."));
665
3e3b026f
UW
666 gdbarch = get_objfile_arch (fork_objf);
667 ret = value_from_longest (builtin_type (gdbarch)->builtin_int, 0);
2277426b
PA
668
669 /* Tell linux-nat.c that we're checkpointing this inferior. */
b7b633e9
TT
670 {
671 scoped_restore save_pid
e99b03dc 672 = make_scoped_restore (&checkpointing_pid, inferior_ptid.pid ());
b7b633e9 673
e71585ff 674 ret = call_function_by_hand (fork_fn, NULL, {});
b7b633e9 675 }
2277426b 676
ac264b3b
MS
677 if (!ret) /* Probably can't happen. */
678 error (_("checkpoint: call_function_by_hand returned null."));
679
680 retpid = value_as_long (ret);
681 get_last_target_status (&last_target_ptid, &last_target_waitstatus);
6f9d33d8
PP
682
683 fp = find_fork_pid (retpid);
684
ac264b3b
MS
685 if (from_tty)
686 {
687 int parent_pid;
688
6f9d33d8
PP
689 printf_filtered (_("checkpoint %d: fork returned pid %ld.\n"),
690 fp != NULL ? fp->num : -1, (long) retpid);
ac264b3b
MS
691 if (info_verbose)
692 {
e38504b3 693 parent_pid = last_target_ptid.lwp ();
ac264b3b 694 if (parent_pid == 0)
e99b03dc 695 parent_pid = last_target_ptid.pid ();
3cb5bea9 696 printf_filtered (_(" gdb says parent = %ld.\n"),
ac264b3b
MS
697 (long) parent_pid);
698 }
699 }
700
ac264b3b
MS
701 if (!fp)
702 error (_("Failed to find new fork"));
72f31aea 703
06974e6c 704 if (one_fork_p ())
72f31aea
PA
705 {
706 /* Special case -- if this is the first fork in the list (the
707 list was hitherto empty), then add inferior_ptid first, as a
708 special zeroeth fork id. */
06974e6c 709 fork_list.emplace_front (inferior_ptid.pid ());
72f31aea
PA
710 }
711
b7e60d85 712 fork_save_infrun_state (fp);
7a298875 713 fp->parent_ptid = last_target_ptid;
ac264b3b
MS
714}
715
716static void
717linux_fork_context (struct fork_info *newfp, int from_tty)
718{
719 /* Now we attempt to switch processes. */
0d14fc63 720 struct fork_info *oldfp;
ac264b3b 721
0d14fc63 722 gdb_assert (newfp != NULL);
ac264b3b 723
0d14fc63
PA
724 oldfp = find_fork_ptid (inferior_ptid);
725 gdb_assert (oldfp != NULL);
ac264b3b 726
b7e60d85 727 fork_save_infrun_state (oldfp);
74960c60 728 remove_breakpoints ();
ac264b3b 729 fork_load_infrun_state (newfp);
74960c60 730 insert_breakpoints ();
ac264b3b 731
3cb5bea9 732 printf_filtered (_("Switching to %s\n"),
ac264b3b
MS
733 target_pid_to_str (inferior_ptid));
734
08d72866 735 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
ac264b3b
MS
736}
737
2277426b 738/* Switch inferior process (checkpoint) context, by checkpoint id. */
ac264b3b 739static void
0b39b52e 740restart_command (const char *args, int from_tty)
ac264b3b
MS
741{
742 struct fork_info *fp;
743
744 if (!args || !*args)
745 error (_("Requires argument (checkpoint id to restart)"));
746
747 if ((fp = find_fork_id (parse_and_eval_long (args))) == NULL)
748 error (_("Not found: checkpoint id %s"), args);
749
750 linux_fork_context (fp, from_tty);
751}
752
753void
754_initialize_linux_fork (void)
755{
ac264b3b
MS
756 /* Checkpoint command: create a fork of the inferior process
757 and set it aside for later debugging. */
758
759 add_com ("checkpoint", class_obscure, checkpoint_command, _("\
760Fork a duplicate process (experimental)."));
761
2277426b
PA
762 /* Restart command: restore the context of a specified checkpoint
763 process. */
ac264b3b
MS
764
765 add_com ("restart", class_obscure, restart_command, _("\
c8a15b78
TT
766restart N: restore program context from a checkpoint.\n\
767Argument N is checkpoint ID, as displayed by 'info checkpoints'."));
ac264b3b 768
b8db102d 769 /* Delete checkpoint command: kill the process and remove it from
3cb5bea9 770 the fork list. */
ac264b3b 771
3cb5bea9 772 add_cmd ("checkpoint", class_obscure, delete_checkpoint_command, _("\
2277426b 773Delete a checkpoint (experimental)."),
b8db102d 774 &deletelist);
ac264b3b 775
3cb5bea9 776 /* Detach checkpoint command: release the process to run independently,
ac264b3b
MS
777 and remove it from the fork list. */
778
3cb5bea9 779 add_cmd ("checkpoint", class_obscure, detach_checkpoint_command, _("\
2277426b 780Detach from a checkpoint (experimental)."),
f73adfeb 781 &detachlist);
ac264b3b 782
3cb5bea9 783 /* Info checkpoints command: list all forks/checkpoints
ac264b3b
MS
784 currently under gdb's control. */
785
3cb5bea9 786 add_info ("checkpoints", info_checkpoints_command,
2277426b 787 _("IDs of currently known checkpoints."));
ac264b3b 788}
This page took 1.15306 seconds and 4 git commands to generate.