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