use bound_minsym as result for lookup_minimal_symbol et al
[deliverable/binutils-gdb.git] / gdb / linux-fork.c
CommitLineData
ac264b3b
MS
1/* GNU/Linux native-dependent code for debugging multiple forks.
2
ecd75fc8 3 Copyright (C) 2005-2014 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"
0e9f083f 28#include <string.h>
ac264b3b 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"
2978b111 36#include <dirent.h>
ac264b3b
MS
37#include <ctype.h>
38
39struct fork_info *fork_list;
40static int highest_fork_num;
41
42/* Prevent warning from -Wmissing-prototypes. */
43extern void _initialize_linux_fork (void);
44
ac264b3b
MS
45/* Fork list data structure: */
46struct fork_info
47{
48 struct fork_info *next;
49 ptid_t ptid;
7a298875 50 ptid_t parent_ptid;
1777feb0 51 int num; /* Convenient handle (GDB fork id). */
3cb5bea9 52 struct regcache *savedregs; /* Convenient for info fork, saves
ac264b3b
MS
53 having to actually switch contexts. */
54 int clobber_regs; /* True if we should restore saved regs. */
ac264b3b
MS
55 off_t *filepos; /* Set of open file descriptors' offsets. */
56 int maxfd;
57};
58
59/* Fork list methods: */
60
3cb5bea9 61int
ac264b3b
MS
62forks_exist_p (void)
63{
64 return (fork_list != NULL);
65}
66
3cb5bea9 67/* Add a fork to the internal fork list. */
ac264b3b 68
3cb5bea9 69struct fork_info *
ac264b3b
MS
70add_fork (pid_t pid)
71{
72 struct fork_info *fp;
73
dfd4cc63 74 if (fork_list == NULL && pid != ptid_get_pid (inferior_ptid))
ac264b3b
MS
75 {
76 /* Special case -- if this is the first fork in the list
77 (the list is hitherto empty), and if this new fork is
78 NOT the current inferior_ptid, then add inferior_ptid
79 first, as a special zeroeth fork id. */
80 highest_fork_num = -1;
dfd4cc63 81 add_fork (ptid_get_pid (inferior_ptid)); /* safe recursion */
ac264b3b
MS
82 }
83
41bf6aca 84 fp = XCNEW (struct fork_info);
f973ed9c 85 fp->ptid = ptid_build (pid, pid, 0);
ac264b3b
MS
86 fp->num = ++highest_fork_num;
87 fp->next = fork_list;
88 fork_list = fp;
89 return fp;
90}
91
92static void
93free_fork (struct fork_info *fp)
94{
95 /* Notes on step-resume breakpoints: since this is a concern for
96 threads, let's convince ourselves that it's not a concern for
97 forks. There are two ways for a fork_info to be created. First,
98 by the checkpoint command, in which case we're at a gdb prompt
99 and there can't be any step-resume breakpoint. Second, by a fork
100 in the user program, in which case we *may* have stepped into the
101 fork call, but regardless of whether we follow the parent or the
102 child, we will return to the same place and the step-resume
103 breakpoint, if any, will take care of itself as usual. And
104 unlike threads, we do not save a private copy of the step-resume
105 breakpoint -- so we're OK. */
106
107 if (fp)
108 {
109 if (fp->savedregs)
110 regcache_xfree (fp->savedregs);
111 if (fp->filepos)
112 xfree (fp->filepos);
113 xfree (fp);
114 }
115}
116
117static void
118delete_fork (ptid_t ptid)
119{
120 struct fork_info *fp, *fpprev;
121
122 fpprev = NULL;
123
26cb8b7c
PA
124 linux_nat_forget_process (ptid_get_pid (ptid));
125
ac264b3b
MS
126 for (fp = fork_list; fp; fpprev = fp, fp = fp->next)
127 if (ptid_equal (fp->ptid, ptid))
128 break;
129
130 if (!fp)
131 return;
132
133 if (fpprev)
134 fpprev->next = fp->next;
135 else
136 fork_list = fp->next;
137
138 free_fork (fp);
139
3cb5bea9 140 /* Special case: if there is now only one process in the list,
ac264b3b
MS
141 and if it is (hopefully!) the current inferior_ptid, then
142 remove it, leaving the list empty -- we're now down to the
143 default case of debugging a single process. */
144 if (fork_list != NULL && fork_list->next == NULL &&
145 ptid_equal (fork_list->ptid, inferior_ptid))
146 {
147 /* Last fork -- delete from list and handle as solo process
148 (should be a safe recursion). */
149 delete_fork (inferior_ptid);
150 }
151}
152
153/* Find a fork_info by matching PTID. */
154static struct fork_info *
155find_fork_ptid (ptid_t ptid)
156{
157 struct fork_info *fp;
158
159 for (fp = fork_list; fp; fp = fp->next)
160 if (ptid_equal (fp->ptid, ptid))
161 return fp;
162
163 return NULL;
164}
165
166/* Find a fork_info by matching ID. */
167static struct fork_info *
168find_fork_id (int num)
169{
170 struct fork_info *fp;
171
172 for (fp = fork_list; fp; fp = fp->next)
173 if (fp->num == num)
174 return fp;
175
176 return NULL;
177}
178
179/* Find a fork_info by matching pid. */
180extern struct fork_info *
181find_fork_pid (pid_t pid)
182{
183 struct fork_info *fp;
184
185 for (fp = fork_list; fp; fp = fp->next)
186 if (pid == ptid_get_pid (fp->ptid))
187 return fp;
188
189 return NULL;
190}
191
192static ptid_t
193fork_id_to_ptid (int num)
194{
195 struct fork_info *fork = find_fork_id (num);
196 if (fork)
197 return fork->ptid;
198 else
199 return pid_to_ptid (-1);
200}
201
202static void
203init_fork_list (void)
204{
205 struct fork_info *fp, *fpnext;
206
207 if (!fork_list)
208 return;
209
210 for (fp = fork_list; fp; fp = fpnext)
211 {
212 fpnext = fp->next;
213 free_fork (fp);
214 }
215
216 fork_list = NULL;
217}
218
219/* Fork list <-> gdb interface. */
220
3cb5bea9 221/* Utility function for fork_load/fork_save.
ac264b3b
MS
222 Calls lseek in the (current) inferior process. */
223
224static off_t
225call_lseek (int fd, off_t offset, int whence)
226{
227 char exp[80];
228
229 snprintf (&exp[0], sizeof (exp), "lseek (%d, %ld, %d)",
230 fd, (long) offset, whence);
231 return (off_t) parse_and_eval_long (&exp[0]);
232}
233
234/* Load infrun state for the fork PTID. */
235
236static void
237fork_load_infrun_state (struct fork_info *fp)
238{
239 extern void nullify_last_target_wait_ptid ();
240 int i;
241
2277426b 242 linux_nat_switch_fork (fp->ptid);
f973ed9c 243
ac264b3b 244 if (fp->savedregs && fp->clobber_regs)
594f7785 245 regcache_cpy (get_current_regcache (), fp->savedregs);
ac264b3b 246
791b663b
DJ
247 registers_changed ();
248 reinit_frame_cache ();
249
fb14de7b 250 stop_pc = regcache_read_pc (get_current_regcache ());
ac264b3b
MS
251 nullify_last_target_wait_ptid ();
252
253 /* Now restore the file positions of open file descriptors. */
254 if (fp->filepos)
255 {
256 for (i = 0; i <= fp->maxfd; i++)
257 if (fp->filepos[i] != (off_t) -1)
258 call_lseek (i, fp->filepos[i], SEEK_SET);
259 /* NOTE: I can get away with using SEEK_SET and SEEK_CUR because
260 this is native-only. If it ever has to be cross, we'll have
261 to rethink this. */
262 }
263}
264
265/* Save infrun state for the fork PTID.
266 Exported for use by linux child_follow_fork. */
267
2277426b 268static void
ac264b3b
MS
269fork_save_infrun_state (struct fork_info *fp, int clobber_regs)
270{
d8d2a3ee 271 char path[PATH_MAX];
ac264b3b
MS
272 struct dirent *de;
273 DIR *d;
274
275 if (fp->savedregs)
276 regcache_xfree (fp->savedregs);
277
594f7785 278 fp->savedregs = regcache_dup (get_current_regcache ());
ac264b3b 279 fp->clobber_regs = clobber_regs;
ac264b3b
MS
280
281 if (clobber_regs)
282 {
283 /* Now save the 'state' (file position) of all open file descriptors.
284 Unfortunately fork does not take care of that for us... */
dfd4cc63
LM
285 snprintf (path, PATH_MAX, "/proc/%ld/fd",
286 (long) ptid_get_pid (fp->ptid));
ac264b3b
MS
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 {
dfd4cc63 337 pid = ptid_get_pid (fp->ptid);
56aac7e8 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
52554a0e 390linux_fork_detach (const char *args, int from_tty)
7a7d3353
PA
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
dfd4cc63 396 if (ptrace (PTRACE_DETACH, ptid_get_pid (inferior_ptid), 0, 0))
7a7d3353
PA
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 457 /* Get the waitpid_fn. */
3b7344d5 458 if (lookup_minimal_symbol ("waitpid", NULL, NULL).minsym != NULL)
7a298875 459 waitpid_fn = find_function_in_inferior ("waitpid", &waitpid_objf);
3b7344d5
TT
460 if (!waitpid_fn
461 && lookup_minimal_symbol ("_waitpid", NULL, NULL).minsym != NULL)
7a298875
HZ
462 waitpid_fn = find_function_in_inferior ("_waitpid", &waitpid_objf);
463 if (!waitpid_fn)
464 goto out;
465
466 /* Get the argv. */
467 argv[0] = value_from_longest (builtin_type (gdbarch)->builtin_int, pid);
468 argv[1] = value_from_pointer (builtin_type (gdbarch)->builtin_data_ptr, 0);
469 argv[2] = value_from_longest (builtin_type (gdbarch)->builtin_int, 0);
470 argv[3] = 0;
471
e17c9e56
HZ
472 retv = call_function_by_hand (waitpid_fn, 3, argv);
473 if (value_as_long (retv) < 0)
474 goto out;
7a298875
HZ
475
476 ret = 0;
477
478out:
e17c9e56 479 do_cleanups (old_cleanup);
7a298875
HZ
480 return ret;
481}
482
ac264b3b
MS
483/* Fork list <-> user interface. */
484
485static void
3cb5bea9 486delete_checkpoint_command (char *args, int from_tty)
ac264b3b 487{
e17c9e56 488 ptid_t ptid, pptid;
7a298875 489 struct fork_info *fi;
ac264b3b
MS
490
491 if (!args || !*args)
2277426b 492 error (_("Requires argument (checkpoint id to delete)"));
ac264b3b
MS
493
494 ptid = fork_id_to_ptid (parse_and_eval_long (args));
495 if (ptid_equal (ptid, minus_one_ptid))
2277426b 496 error (_("No such checkpoint id, %s"), args);
ac264b3b
MS
497
498 if (ptid_equal (ptid, inferior_ptid))
3cb5bea9
PA
499 error (_("\
500Please switch to another checkpoint before deleting the current one"));
ac264b3b 501
dfd4cc63 502 if (ptrace (PTRACE_KILL, ptid_get_pid (ptid), 0, 0))
54ba13f7 503 error (_("Unable to kill pid %s"), target_pid_to_str (ptid));
ac264b3b 504
7a298875
HZ
505 fi = find_fork_ptid (ptid);
506 gdb_assert (fi);
e17c9e56 507 pptid = fi->parent_ptid;
7a298875 508
ac264b3b
MS
509 if (from_tty)
510 printf_filtered (_("Killed %s\n"), target_pid_to_str (ptid));
511
512 delete_fork (ptid);
7a298875
HZ
513
514 /* If fi->parent_ptid is not a part of lwp but it's a part of checkpoint
515 list, waitpid the ptid.
516 If fi->parent_ptid is a part of lwp and it is stoped, waitpid the
517 ptid. */
e17c9e56
HZ
518 if ((!find_thread_ptid (pptid) && find_fork_ptid (pptid))
519 || (find_thread_ptid (pptid) && is_stopped (pptid)))
7a298875 520 {
dfd4cc63 521 if (inferior_call_waitpid (pptid, ptid_get_pid (ptid)))
7a298875
HZ
522 warning (_("Unable to wait pid %s"), target_pid_to_str (ptid));
523 }
ac264b3b
MS
524}
525
526static void
3cb5bea9 527detach_checkpoint_command (char *args, int from_tty)
ac264b3b
MS
528{
529 ptid_t ptid;
530
531 if (!args || !*args)
2277426b 532 error (_("Requires argument (checkpoint id to detach)"));
ac264b3b
MS
533
534 ptid = fork_id_to_ptid (parse_and_eval_long (args));
535 if (ptid_equal (ptid, minus_one_ptid))
2277426b 536 error (_("No such checkpoint id, %s"), args);
ac264b3b
MS
537
538 if (ptid_equal (ptid, inferior_ptid))
2277426b
PA
539 error (_("\
540Please switch to another checkpoint before detaching the current one"));
ac264b3b 541
dfd4cc63 542 if (ptrace (PTRACE_DETACH, ptid_get_pid (ptid), 0, 0))
ac264b3b
MS
543 error (_("Unable to detach %s"), target_pid_to_str (ptid));
544
545 if (from_tty)
546 printf_filtered (_("Detached %s\n"), target_pid_to_str (ptid));
547
548 delete_fork (ptid);
549}
550
3cb5bea9 551/* Print information about currently known checkpoints. */
ac264b3b
MS
552
553static void
3cb5bea9 554info_checkpoints_command (char *arg, int from_tty)
ac264b3b 555{
5af949e3 556 struct gdbarch *gdbarch = get_current_arch ();
ac264b3b 557 struct symtab_and_line sal;
ac264b3b 558 struct fork_info *fp;
ac264b3b 559 ULONGEST pc;
b8db102d
MS
560 int requested = -1;
561 struct fork_info *printed = NULL;
562
563 if (arg && *arg)
564 requested = (int) parse_and_eval_long (arg);
ac264b3b
MS
565
566 for (fp = fork_list; fp; fp = fp->next)
567 {
b8db102d
MS
568 if (requested > 0 && fp->num != requested)
569 continue;
570
571 printed = fp;
ac264b3b
MS
572 if (ptid_equal (fp->ptid, inferior_ptid))
573 {
574 printf_filtered ("* ");
fb14de7b 575 pc = regcache_read_pc (get_current_regcache ());
ac264b3b
MS
576 }
577 else
578 {
579 printf_filtered (" ");
2277426b 580 pc = regcache_read_pc (fp->savedregs);
ac264b3b
MS
581 }
582 printf_filtered ("%d %s", fp->num, target_pid_to_str (fp->ptid));
583 if (fp->num == 0)
584 printf_filtered (_(" (main process)"));
585 printf_filtered (_(" at "));
5af949e3 586 fputs_filtered (paddress (gdbarch, pc), gdb_stdout);
ac264b3b
MS
587
588 sal = find_pc_line (pc, 0);
589 if (sal.symtab)
05cba821
JK
590 printf_filtered (_(", file %s"),
591 symtab_to_filename_for_display (sal.symtab));
ac264b3b
MS
592 if (sal.line)
593 printf_filtered (_(", line %d"), sal.line);
594 if (!sal.symtab && !sal.line)
595 {
7cbd4a93 596 struct bound_minimal_symbol msym;
ac264b3b
MS
597
598 msym = lookup_minimal_symbol_by_pc (pc);
7cbd4a93 599 if (msym.minsym)
efd66ac6 600 printf_filtered (", <%s>", MSYMBOL_LINKAGE_NAME (msym.minsym));
ac264b3b
MS
601 }
602
603 putchar_filtered ('\n');
604 }
b8db102d
MS
605 if (printed == NULL)
606 {
607 if (requested > 0)
2277426b 608 printf_filtered (_("No checkpoint number %d.\n"), requested);
b8db102d 609 else
2277426b 610 printf_filtered (_("No checkpoints.\n"));
b8db102d 611 }
ac264b3b
MS
612}
613
2277426b
PA
614/* The PID of the process we're checkpointing. */
615static int checkpointing_pid = 0;
ac264b3b 616
2277426b
PA
617int
618linux_fork_checkpointing_p (int pid)
ac264b3b 619{
2277426b 620 return (checkpointing_pid == pid);
ac264b3b
MS
621}
622
92f6badc
KP
623/* Callback for iterate over threads. Used to check whether
624 the current inferior is multi-threaded. Returns true as soon
625 as it sees the second thread of the current inferior. */
626
627static int
628inf_has_multiple_thread_cb (struct thread_info *tp, void *data)
629{
630 int *count_p = (int *) data;
631
632 if (current_inferior ()->pid == ptid_get_pid (tp->ptid))
633 (*count_p)++;
634
635 /* Stop the iteration if multiple threads have been detected. */
636 return *count_p > 1;
637}
638
639/* Return true if the current inferior is multi-threaded. */
640
641static int
642inf_has_multiple_threads (void)
643{
644 int count = 0;
645
646 iterate_over_threads (inf_has_multiple_thread_cb, &count);
647 return (count > 1);
648}
649
ac264b3b
MS
650static void
651checkpoint_command (char *args, int from_tty)
652{
3e3b026f
UW
653 struct objfile *fork_objf;
654 struct gdbarch *gdbarch;
ac264b3b
MS
655 struct target_waitstatus last_target_waitstatus;
656 ptid_t last_target_ptid;
657 struct value *fork_fn = NULL, *ret;
658 struct fork_info *fp;
659 pid_t retpid;
660 struct cleanup *old_chain;
74960c60 661
92f6badc
KP
662 if (!target_has_execution)
663 error (_("The program is not being run."));
664
665 /* Ensure that the inferior is not multithreaded. */
666 update_thread_list ();
667 if (inf_has_multiple_threads ())
668 error (_("checkpoint: can't checkpoint multiple threads."));
669
ac264b3b
MS
670 /* Make the inferior fork, record its (and gdb's) state. */
671
3b7344d5 672 if (lookup_minimal_symbol ("fork", NULL, NULL).minsym != NULL)
3e3b026f 673 fork_fn = find_function_in_inferior ("fork", &fork_objf);
ac264b3b 674 if (!fork_fn)
3b7344d5 675 if (lookup_minimal_symbol ("_fork", NULL, NULL).minsym != NULL)
3e3b026f 676 fork_fn = find_function_in_inferior ("fork", &fork_objf);
ac264b3b
MS
677 if (!fork_fn)
678 error (_("checkpoint: can't find fork function in inferior."));
679
3e3b026f
UW
680 gdbarch = get_objfile_arch (fork_objf);
681 ret = value_from_longest (builtin_type (gdbarch)->builtin_int, 0);
2277426b
PA
682
683 /* Tell linux-nat.c that we're checkpointing this inferior. */
684 old_chain = make_cleanup_restore_integer (&checkpointing_pid);
dfd4cc63 685 checkpointing_pid = ptid_get_pid (inferior_ptid);
2277426b 686
ac264b3b
MS
687 ret = call_function_by_hand (fork_fn, 0, &ret);
688 do_cleanups (old_chain);
689 if (!ret) /* Probably can't happen. */
690 error (_("checkpoint: call_function_by_hand returned null."));
691
692 retpid = value_as_long (ret);
693 get_last_target_status (&last_target_ptid, &last_target_waitstatus);
694 if (from_tty)
695 {
696 int parent_pid;
697
3cb5bea9 698 printf_filtered (_("checkpoint: fork returned pid %ld.\n"),
ac264b3b
MS
699 (long) retpid);
700 if (info_verbose)
701 {
702 parent_pid = ptid_get_lwp (last_target_ptid);
703 if (parent_pid == 0)
704 parent_pid = ptid_get_pid (last_target_ptid);
3cb5bea9 705 printf_filtered (_(" gdb says parent = %ld.\n"),
ac264b3b
MS
706 (long) parent_pid);
707 }
708 }
709
710 fp = find_fork_pid (retpid);
711 if (!fp)
712 error (_("Failed to find new fork"));
713 fork_save_infrun_state (fp, 1);
7a298875 714 fp->parent_ptid = last_target_ptid;
ac264b3b
MS
715}
716
717static void
718linux_fork_context (struct fork_info *newfp, int from_tty)
719{
720 /* Now we attempt to switch processes. */
0d14fc63 721 struct fork_info *oldfp;
ac264b3b 722
0d14fc63 723 gdb_assert (newfp != NULL);
ac264b3b 724
0d14fc63
PA
725 oldfp = find_fork_ptid (inferior_ptid);
726 gdb_assert (oldfp != NULL);
ac264b3b
MS
727
728 fork_save_infrun_state (oldfp, 1);
74960c60 729 remove_breakpoints ();
ac264b3b 730 fork_load_infrun_state (newfp);
74960c60 731 insert_breakpoints ();
ac264b3b 732
3cb5bea9 733 printf_filtered (_("Switching to %s\n"),
ac264b3b
MS
734 target_pid_to_str (inferior_ptid));
735
08d72866 736 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
ac264b3b
MS
737}
738
2277426b 739/* Switch inferior process (checkpoint) context, by checkpoint id. */
ac264b3b
MS
740static void
741restart_command (char *args, int from_tty)
742{
743 struct fork_info *fp;
744
745 if (!args || !*args)
746 error (_("Requires argument (checkpoint id to restart)"));
747
748 if ((fp = find_fork_id (parse_and_eval_long (args))) == NULL)
749 error (_("Not found: checkpoint id %s"), args);
750
751 linux_fork_context (fp, from_tty);
752}
753
754void
755_initialize_linux_fork (void)
756{
757 init_fork_list ();
758
ac264b3b
MS
759 /* Checkpoint command: create a fork of the inferior process
760 and set it aside for later debugging. */
761
762 add_com ("checkpoint", class_obscure, checkpoint_command, _("\
763Fork a duplicate process (experimental)."));
764
2277426b
PA
765 /* Restart command: restore the context of a specified checkpoint
766 process. */
ac264b3b
MS
767
768 add_com ("restart", class_obscure, restart_command, _("\
769restart <n>: restore program context from a checkpoint.\n\
770Argument 'n' is checkpoint ID, as displayed by 'info checkpoints'."));
771
b8db102d 772 /* Delete checkpoint command: kill the process and remove it from
3cb5bea9 773 the fork list. */
ac264b3b 774
3cb5bea9 775 add_cmd ("checkpoint", class_obscure, delete_checkpoint_command, _("\
2277426b 776Delete a checkpoint (experimental)."),
b8db102d 777 &deletelist);
ac264b3b 778
3cb5bea9 779 /* Detach checkpoint command: release the process to run independently,
ac264b3b
MS
780 and remove it from the fork list. */
781
3cb5bea9 782 add_cmd ("checkpoint", class_obscure, detach_checkpoint_command, _("\
2277426b 783Detach from a checkpoint (experimental)."),
f73adfeb 784 &detachlist);
ac264b3b 785
3cb5bea9 786 /* Info checkpoints command: list all forks/checkpoints
ac264b3b
MS
787 currently under gdb's control. */
788
3cb5bea9 789 add_info ("checkpoints", info_checkpoints_command,
2277426b 790 _("IDs of currently known checkpoints."));
ac264b3b 791}
This page took 0.859381 seconds and 4 git commands to generate.