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