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