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