Refine read_string
[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 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
MS
32
33#include <sys/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. */
3cb5bea9 300 fp->filepos = xrealloc (fp->filepos,
ac264b3b
MS
301 (fp->maxfd + 1) * sizeof (*fp->filepos));
302
303 /* Initialize to -1 (invalid). */
304 for (tmp = 0; tmp <= fp->maxfd; tmp++)
305 fp->filepos[tmp] = -1;
306
307 /* Now find actual file positions. */
308 rewinddir (d);
309 while ((de = readdir (d)) != NULL)
310 if (isdigit (de->d_name[0]))
311 {
312 tmp = strtol (&de->d_name[0], NULL, 10);
313 fp->filepos[tmp] = call_lseek (tmp, 0, SEEK_CUR);
314 }
315 closedir (d);
316 }
317 }
318}
319
320/* Kill 'em all, let God sort 'em out... */
321
3cb5bea9 322void
ac264b3b
MS
323linux_fork_killall (void)
324{
325 /* Walk list and kill every pid. No need to treat the
326 current inferior_ptid as special (we do not return a
327 status for it) -- however any process may be a child
328 or a parent, so may get a SIGCHLD from a previously
329 killed child. Wait them all out. */
56aac7e8 330 struct fork_info *fp;
ac264b3b
MS
331 pid_t pid, ret;
332 int status;
333
56aac7e8
MS
334 for (fp = fork_list; fp; fp = fp->next)
335 {
dfd4cc63 336 pid = ptid_get_pid (fp->ptid);
56aac7e8 337 do {
4c28f408
PA
338 /* Use SIGKILL instead of PTRACE_KILL because the former works even
339 if the thread is running, while the later doesn't. */
340 kill (pid, SIGKILL);
56aac7e8
MS
341 ret = waitpid (pid, &status, 0);
342 /* We might get a SIGCHLD instead of an exit status. This is
343 aggravated by the first kill above - a child has just
344 died. MVS comment cut-and-pasted from linux-nat. */
345 } while (ret == pid && WIFSTOPPED (status));
346 }
347 init_fork_list (); /* Clear list, prepare to start fresh. */
ac264b3b
MS
348}
349
350/* The current inferior_ptid has exited, but there are other viable
351 forks to debug. Delete the exiting one and context-switch to the
352 first available. */
353
3cb5bea9 354void
ac264b3b
MS
355linux_fork_mourn_inferior (void)
356{
357 /* Wait just one more time to collect the inferior's exit status.
358 Do not check whether this succeeds though, since we may be
359 dealing with a process that we attached to. Such a process will
360 only report its exit status to its original parent. */
361 int status;
362
363 waitpid (ptid_get_pid (inferior_ptid), &status, 0);
364
365 /* OK, presumably inferior_ptid is the one who has exited.
366 We need to delete that one from the fork_list, and switch
367 to the next available fork. */
368 delete_fork (inferior_ptid);
791b663b
DJ
369
370 /* There should still be a fork - if there's only one left,
371 delete_fork won't remove it, because we haven't updated
372 inferior_ptid yet. */
373 gdb_assert (fork_list);
374
375 fork_load_infrun_state (fork_list);
376 printf_filtered (_("[Switching to %s]\n"),
377 target_pid_to_str (inferior_ptid));
378
379 /* If there's only one fork, switch back to non-fork mode. */
380 if (fork_list->next == NULL)
381 delete_fork (inferior_ptid);
ac264b3b
MS
382}
383
7a7d3353
PA
384/* The current inferior_ptid is being detached, but there are other
385 viable forks to debug. Detach and delete it and context-switch to
386 the first available. */
387
3cb5bea9 388void
52554a0e 389linux_fork_detach (const char *args, int from_tty)
7a7d3353
PA
390{
391 /* OK, inferior_ptid is the one we are detaching from. We need to
392 delete it from the fork_list, and switch to the next available
393 fork. */
394
dfd4cc63 395 if (ptrace (PTRACE_DETACH, ptid_get_pid (inferior_ptid), 0, 0))
7a7d3353
PA
396 error (_("Unable to detach %s"), target_pid_to_str (inferior_ptid));
397
398 delete_fork (inferior_ptid);
7a7d3353
PA
399
400 /* There should still be a fork - if there's only one left,
401 delete_fork won't remove it, because we haven't updated
402 inferior_ptid yet. */
403 gdb_assert (fork_list);
404
405 fork_load_infrun_state (fork_list);
406
407 if (from_tty)
408 printf_filtered (_("[Switching to %s]\n"),
409 target_pid_to_str (inferior_ptid));
410
411 /* If there's only one fork, switch back to non-fork mode. */
412 if (fork_list->next == NULL)
413 delete_fork (inferior_ptid);
414}
415
7a298875
HZ
416static void
417inferior_call_waitpid_cleanup (void *fp)
418{
419 struct fork_info *oldfp = fp;
420
e17c9e56
HZ
421 if (oldfp)
422 {
1777feb0 423 /* Switch back to inferior_ptid. */
e17c9e56
HZ
424 remove_breakpoints ();
425 fork_load_infrun_state (oldfp);
426 insert_breakpoints ();
427 }
7a298875
HZ
428}
429
430static int
431inferior_call_waitpid (ptid_t pptid, int pid)
432{
433 struct objfile *waitpid_objf;
434 struct value *waitpid_fn = NULL;
e17c9e56 435 struct value *argv[4], *retv;
7a298875
HZ
436 struct gdbarch *gdbarch = get_current_arch ();
437 struct fork_info *oldfp = NULL, *newfp = NULL;
e17c9e56 438 struct cleanup *old_cleanup;
7a298875
HZ
439 int ret = -1;
440
441 if (!ptid_equal (pptid, inferior_ptid))
442 {
443 /* Switch to pptid. */
444 oldfp = find_fork_ptid (inferior_ptid);
445 gdb_assert (oldfp != NULL);
446 newfp = find_fork_ptid (pptid);
da3ecdc6 447 gdb_assert (newfp != NULL);
7a298875
HZ
448 fork_save_infrun_state (oldfp, 1);
449 remove_breakpoints ();
450 fork_load_infrun_state (newfp);
451 insert_breakpoints ();
7a298875
HZ
452 }
453
e17c9e56
HZ
454 old_cleanup = make_cleanup (inferior_call_waitpid_cleanup, oldfp);
455
7a298875 456 /* Get the waitpid_fn. */
3b7344d5 457 if (lookup_minimal_symbol ("waitpid", NULL, NULL).minsym != NULL)
7a298875 458 waitpid_fn = find_function_in_inferior ("waitpid", &waitpid_objf);
3b7344d5
TT
459 if (!waitpid_fn
460 && lookup_minimal_symbol ("_waitpid", NULL, NULL).minsym != NULL)
7a298875
HZ
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
dfd4cc63 501 if (ptrace (PTRACE_KILL, ptid_get_pid (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 {
dfd4cc63 520 if (inferior_call_waitpid (pptid, ptid_get_pid (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
dfd4cc63 541 if (ptrace (PTRACE_DETACH, ptid_get_pid (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 {
7cbd4a93 595 struct bound_minimal_symbol msym;
ac264b3b
MS
596
597 msym = lookup_minimal_symbol_by_pc (pc);
7cbd4a93 598 if (msym.minsym)
efd66ac6 599 printf_filtered (", <%s>", MSYMBOL_LINKAGE_NAME (msym.minsym));
ac264b3b
MS
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
3b7344d5 671 if (lookup_minimal_symbol ("fork", NULL, NULL).minsym != NULL)
3e3b026f 672 fork_fn = find_function_in_inferior ("fork", &fork_objf);
ac264b3b 673 if (!fork_fn)
3b7344d5 674 if (lookup_minimal_symbol ("_fork", NULL, NULL).minsym != 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);
dfd4cc63 684 checkpointing_pid = ptid_get_pid (inferior_ptid);
2277426b 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
08d72866 735 print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
ac264b3b
MS
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.798507 seconds and 4 git commands to generate.