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