|
|
1.1 ! root 1: /* Start and stop the inferior process, for GDB. ! 2: Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. ! 3: ! 4: GDB is distributed in the hope that it will be useful, but WITHOUT ANY ! 5: WARRANTY. No author or distributor accepts responsibility to anyone ! 6: for the consequences of using it or for whether it serves any ! 7: particular purpose or works at all, unless he says so in writing. ! 8: Refer to the GDB General Public License for full details. ! 9: ! 10: Everyone is granted permission to copy, modify and redistribute GDB, ! 11: but only under the conditions described in the GDB General Public ! 12: License. A copy of this license is supposed to have been given to you ! 13: along with GDB so you can know your rights and responsibilities. It ! 14: should be in a file named COPYING. Among other things, the copyright ! 15: notice and this notice must be preserved on all copies. ! 16: ! 17: In other words, go ahead and share GDB, but don't try to stop ! 18: anyone else from sharing it farther. Help stamp out software hoarding! ! 19: */ ! 20: ! 21: #include "defs.h" ! 22: #include "initialize.h" ! 23: #include "param.h" ! 24: #include "symtab.h" ! 25: #include "frame.h" ! 26: #include "inferior.h" ! 27: #include "wait.h" ! 28: ! 29: #include <stdio.h> ! 30: #include <signal.h> ! 31: #include <a.out.h> ! 32: #include <sys/file.h> ! 33: ! 34: #ifdef UMAX_PTRACE ! 35: #include <sys/param.h> ! 36: #include <sys/ptrace.h> ! 37: #endif UMAX_PTRACE ! 38: ! 39: extern char *sys_siglist[]; ! 40: extern int errno; ! 41: ! 42: /* Tables of how to react to signals; the user sets them. */ ! 43: ! 44: static char signal_stop[NSIG]; ! 45: static char signal_print[NSIG]; ! 46: static char signal_program[NSIG]; ! 47: ! 48: /* Nonzero if breakpoints are now inserted in the inferior. */ ! 49: ! 50: static int breakpoints_inserted; ! 51: ! 52: /* Function inferior was in as of last step command. */ ! 53: ! 54: static struct symbol *step_start_function; ! 55: ! 56: /* This is the sequence of bytes we insert for a breakpoint. */ ! 57: ! 58: static char break_insn[] = BREAKPOINT; ! 59: ! 60: /* Nonzero => address for special breakpoint for resuming stepping. */ ! 61: ! 62: static CORE_ADDR step_resume_break_address; ! 63: ! 64: /* Original contents of the byte where the special breakpoint is. */ ! 65: ! 66: static char step_resume_break_shadow[sizeof break_insn]; ! 67: ! 68: /* Nonzero means the special breakpoint is a duplicate ! 69: so it has not itself been inserted. */ ! 70: ! 71: static int step_resume_break_duplicate; ! 72: ! 73: /* Nonzero if we are expecting a trace trap and should proceed from it. ! 74: 2 means expecting 2 trace traps and should continue both times. ! 75: That occurs when we tell sh to exec the program: we will get ! 76: a trap after the exec of sh and a second when the program is exec'd. */ ! 77: ! 78: static int trap_expected; ! 79: ! 80: /* Nonzero if the next time we try to continue the inferior, it will ! 81: step one instruction and generate a spurious trace trap. ! 82: This is used to compensate for a bug in HP-UX. */ ! 83: ! 84: static int trap_expected_after_continue; ! 85: ! 86: /* Nonzero means expecting a trace trap ! 87: and should stop the inferior and return silently when it happens. */ ! 88: ! 89: static int stop_after_trap; ! 90: ! 91: /* Nonzero means expecting a trace trap due to attaching to a process. */ ! 92: ! 93: static int stop_after_attach; ! 94: ! 95: /* Nonzero if pc has been changed by the debugger ! 96: since the inferior stopped. */ ! 97: ! 98: int pc_changed; ! 99: ! 100: /* Nonzero if debugging a remote machine via a serial link or ethernet. */ ! 101: ! 102: int remote_debugging; ! 103: ! 104: /* Save register contents here when about to pop a stack dummy frame. */ ! 105: ! 106: char stop_registers[REGISTER_BYTES]; ! 107: ! 108: /* Nonzero if program stopped due to error trying to insert breakpoints. */ ! 109: ! 110: static int breakpoints_failed; ! 111: ! 112: /* Nonzero if inferior is in sh before our program got exec'd. */ ! 113: ! 114: static int running_in_shell; ! 115: ! 116: /* Nonzero after stop if current stack frame should be printed. */ ! 117: ! 118: static int stop_print_frame; ! 119: ! 120: static void insert_step_breakpoint (); ! 121: static void remove_step_breakpoint (); ! 122: static void wait_for_inferior (); ! 123: static void normal_stop (); ! 124: ! 125: START_FILE ! 126: ! 127: /* Clear out all variables saying what to do when inferior is continued. ! 128: First do this, then set the ones you want, then call `proceed'. */ ! 129: ! 130: void ! 131: clear_proceed_status () ! 132: { ! 133: trap_expected = 0; ! 134: step_range_start = 0; ! 135: step_range_end = 0; ! 136: step_frame = 0; ! 137: step_over_calls = -1; ! 138: step_resume_break_address = 0; ! 139: stop_after_trap = 0; ! 140: stop_after_attach = 0; ! 141: ! 142: /* Discard any remaining commands left by breakpoint we had stopped at. */ ! 143: clear_breakpoint_commands (); ! 144: } ! 145: ! 146: /* Basic routine for continuing the program in various fashions. ! 147: ! 148: ADDR is the address to resume at, or -1 for resume where stopped. ! 149: SIGNAL is the signal to give it, or 0 for none, ! 150: or -1 for act according to how it stopped. ! 151: STEP is nonzero if should trap after one instruction. ! 152: -1 means return after that and print nothing. ! 153: You should probably set various step_... variables ! 154: before calling here, if you are stepping. ! 155: ! 156: You should call clear_proceed_status before calling proceed. */ ! 157: ! 158: void ! 159: proceed (addr, signal, step) ! 160: CORE_ADDR addr; ! 161: int signal; ! 162: int step; ! 163: { ! 164: int oneproc = 0; ! 165: ! 166: if (step > 0) ! 167: step_start_function = find_pc_function (read_pc ()); ! 168: if (step < 0) ! 169: stop_after_trap = 1; ! 170: ! 171: if (addr == -1) ! 172: { ! 173: /* If there is a breakpoint at the address we will resume at, ! 174: step one instruction before inserting breakpoints ! 175: so that we do not stop right away. */ ! 176: ! 177: if (!pc_changed && breakpoint_here_p (read_pc ())) ! 178: oneproc = 1; ! 179: } ! 180: else ! 181: write_register (PC_REGNUM, addr); ! 182: ! 183: if (trap_expected_after_continue) ! 184: { ! 185: /* If (step == 0), a trap will be automatically generated after ! 186: the first instruction is executed. Force step one ! 187: instruction to clear this condition. This should not occur ! 188: if step is nonzero, but it is harmless in that case. */ ! 189: oneproc = 1; ! 190: trap_expected_after_continue = 0; ! 191: } ! 192: ! 193: if (oneproc) ! 194: /* We will get a trace trap after one instruction. ! 195: Continue it automatically and insert breakpoints then. */ ! 196: trap_expected = 1; ! 197: else ! 198: { ! 199: int temp = insert_breakpoints (); ! 200: if (temp) ! 201: { ! 202: print_sys_errmsg ("ptrace", temp); ! 203: error ("Cannot insert breakpoints.\n\ ! 204: The same program may be running in another process."); ! 205: } ! 206: breakpoints_inserted = 1; ! 207: } ! 208: ! 209: /* Install inferior's terminal modes. */ ! 210: terminal_inferior (); ! 211: ! 212: if (signal >= 0) ! 213: stop_signal = signal; ! 214: /* If this signal should not be seen by program, ! 215: give it zero. Used for debugging signals. */ ! 216: else if (stop_signal < NSIG && !signal_program[stop_signal]) ! 217: stop_signal= 0; ! 218: ! 219: /* Resume inferior. */ ! 220: resume (oneproc || step, stop_signal); ! 221: ! 222: /* Wait for it to stop (if not standalone) ! 223: and in any case decode why it stopped, and act accordingly. */ ! 224: ! 225: wait_for_inferior (); ! 226: normal_stop (); ! 227: } ! 228: ! 229: /* Writing the inferior pc as a register calls this function ! 230: to inform infrun that the pc has been set in the debugger. */ ! 231: ! 232: writing_pc (val) ! 233: CORE_ADDR val; ! 234: { ! 235: stop_pc = val; ! 236: pc_changed = 1; ! 237: } ! 238: ! 239: /* Start an inferior process for the first time. ! 240: Actually it was started by the fork that created it, ! 241: but it will have stopped one instruction after execing sh. ! 242: Here we must get it up to actual execution of the real program. */ ! 243: ! 244: start_inferior () ! 245: { ! 246: /* We will get a trace trap after one instruction. ! 247: Continue it automatically. Eventually (after shell does an exec) ! 248: it will get another trace trap. Then insert breakpoints and continue. */ ! 249: trap_expected = 2; ! 250: running_in_shell = 0; /* Set to 1 at first SIGTRAP, 0 at second. */ ! 251: trap_expected_after_continue = 0; ! 252: breakpoints_inserted = 0; ! 253: mark_breakpoints_out (); ! 254: ! 255: /* Set up the "saved terminal modes" of the inferior ! 256: based on what modes we are starting it with. */ ! 257: terminal_init_inferior (); ! 258: ! 259: /* Install inferior's terminal modes. */ ! 260: terminal_inferior (); ! 261: ! 262: if (remote_debugging) ! 263: { ! 264: trap_expected = 0; ! 265: fetch_inferior_registers(); ! 266: set_current_frame (read_register(FP_REGNUM)); ! 267: stop_frame = get_current_frame(); ! 268: inferior_pid = 3; ! 269: if (insert_breakpoints()) ! 270: fatal("Can't insert breakpoints"); ! 271: breakpoints_inserted = 1; ! 272: proceed(-1, -1, 0); ! 273: } ! 274: else ! 275: { ! 276: wait_for_inferior (); ! 277: normal_stop (); ! 278: } ! 279: } ! 280: ! 281: /* Start remote-debugging of a machine over a serial link. */ ! 282: ! 283: void ! 284: start_remote () ! 285: { ! 286: clear_proceed_status (); ! 287: running_in_shell = 0; ! 288: trap_expected = 0; ! 289: inferior_pid = 3; ! 290: breakpoints_inserted = 0; ! 291: mark_breakpoints_out (); ! 292: wait_for_inferior (); ! 293: normal_stop(); ! 294: } ! 295: ! 296: #ifdef ATTACH_DETACH ! 297: ! 298: /* Attach to process PID, then initialize for debugging it ! 299: and wait for the trace-trap that results from attaching. */ ! 300: ! 301: void ! 302: attach_program (pid) ! 303: int pid; ! 304: { ! 305: attach (pid); ! 306: inferior_pid = pid; ! 307: ! 308: mark_breakpoints_out (); ! 309: terminal_init_inferior (); ! 310: clear_proceed_status (); ! 311: stop_after_attach = 1; ! 312: /*proceed (-1, 0, -2);*/ ! 313: wait_for_inferior (); ! 314: normal_stop (); ! 315: } ! 316: #endif /* ATTACH_DETACH */ ! 317: ! 318: /* Wait for control to return from inferior to debugger. ! 319: If inferior gets a signal, we may decide to start it up again ! 320: instead of returning. That is why there is a loop in this function. ! 321: When this function actually returns it means the inferior ! 322: should be left stopped and GDB should read more commands. */ ! 323: ! 324: static void ! 325: wait_for_inferior () ! 326: { ! 327: register int pid; ! 328: WAITTYPE w; ! 329: CORE_ADDR pc; ! 330: int tem; ! 331: int another_trap; ! 332: int random_signal; ! 333: CORE_ADDR stop_sp; ! 334: int stop_step_resume_break; ! 335: int newmisc; ! 336: int newfun_pc; ! 337: struct symbol *newfun; ! 338: struct symtab_and_line sal; ! 339: int prev_pc; ! 340: ! 341: prev_pc = read_pc (); ! 342: ! 343: while (1) ! 344: { ! 345: if (remote_debugging) ! 346: remote_wait (&w); ! 347: else ! 348: { ! 349: pid = wait (&w); ! 350: if (pid != inferior_pid) ! 351: continue; ! 352: } ! 353: ! 354: pc_changed = 0; ! 355: fetch_inferior_registers (); ! 356: stop_pc = read_pc (); ! 357: set_current_frame (read_register (FP_REGNUM)); ! 358: stop_frame = get_current_frame (); ! 359: stop_sp = read_register (SP_REGNUM); ! 360: another_trap = 0; ! 361: stop_breakpoint = 0; ! 362: stop_step = 0; ! 363: stop_stack_dummy = 0; ! 364: stop_print_frame = 1; ! 365: stop_step_resume_break = 0; ! 366: random_signal = 0; ! 367: breakpoints_failed = 0; ! 368: ! 369: /* Look at the cause of the stop, and decide what to do. ! 370: The alternatives are: ! 371: 1) break; to really stop and return to the debugger, ! 372: 2) drop through to start up again ! 373: (set another_trap to 1 to single step once) ! 374: 3) set random_signal to 1, and the decision between 1 and 2 ! 375: will be made according to the signal handling tables. */ ! 376: ! 377: if (WIFEXITED (w)) ! 378: { ! 379: terminal_ours_for_output (); ! 380: if (WRETCODE (w)) ! 381: printf ("\nProgram exited with code 0%o.\n", WRETCODE (w)); ! 382: else ! 383: printf ("\nProgram exited normally.\n"); ! 384: fflush (stdout); ! 385: inferior_died (); ! 386: stop_print_frame = 0; ! 387: break; ! 388: } ! 389: else if (!WIFSTOPPED (w)) ! 390: { ! 391: kill_inferior (); ! 392: stop_print_frame = 0; ! 393: stop_signal = WTERMSIG (w); ! 394: terminal_ours_for_output (); ! 395: printf ("\nProgram terminated with signal %d, %s\n", ! 396: stop_signal, ! 397: stop_signal < NSIG ! 398: ? sys_siglist[stop_signal] ! 399: : "(undocumented)"); ! 400: printf ("The inferior process no longer exists.\n"); ! 401: fflush (stdout); ! 402: break; ! 403: } ! 404: else ! 405: { ! 406: stop_signal = WSTOPSIG (w); ! 407: ! 408: /* First, distinguish signals caused by the debugger from signals ! 409: that have to do with the program's own actions. ! 410: Note that breakpoint insns may cause SIGTRAP or SIGILL ! 411: or SIGEMT, depending on the operating system version. ! 412: Here we detect when a SIGILL or SIGEMT is really a breakpoint ! 413: and change it to SIGTRAP. */ ! 414: ! 415: if (stop_signal == SIGTRAP ! 416: || (breakpoints_inserted && ! 417: (stop_signal == SIGILL ! 418: || stop_signal == SIGEMT)) ! 419: || stop_after_attach) ! 420: { ! 421: if (stop_signal == SIGTRAP && stop_after_trap) ! 422: { ! 423: stop_print_frame = 0; ! 424: break; ! 425: } ! 426: if (stop_after_attach) ! 427: break; ! 428: /* Don't even think about breakpoints ! 429: if still running the shell that will exec the program ! 430: or if just proceeded over a breakpoint. */ ! 431: if (stop_signal == SIGTRAP && trap_expected) ! 432: stop_breakpoint = 0; ! 433: else ! 434: /* See if there is a breakpoint at the current PC. */ ! 435: #if DECR_PC_AFTER_BREAK ! 436: /* Notice the case of stepping through a jump ! 437: that leads just after a breakpoint. ! 438: Don't confuse that with hitting the breakpoint. ! 439: What we check for is that 1) stepping is going on ! 440: and 2) the pc before the last insn does not match ! 441: the address of the breakpoint before the current pc. */ ! 442: if (!(prev_pc != stop_pc - DECR_PC_AFTER_BREAK ! 443: && step_range_end && !step_resume_break_address)) ! 444: #endif /* DECR_PC_AFTER_BREAK not zero */ ! 445: { ! 446: select_frame (stop_frame, 0); /* For condition exprs. */ ! 447: stop_breakpoint = breakpoint_stop_status (stop_pc, stop_frame); ! 448: /* Following in case break condition called a function. */ ! 449: stop_print_frame = 1; ! 450: if (stop_breakpoint && DECR_PC_AFTER_BREAK) ! 451: { ! 452: stop_pc -= DECR_PC_AFTER_BREAK; ! 453: write_register (PC_REGNUM, stop_pc); ! 454: pc_changed = 0; ! 455: } ! 456: } ! 457: /* See if we stopped at the special breakpoint for ! 458: stepping over a subroutine call. */ ! 459: if (stop_pc - DECR_PC_AFTER_BREAK == step_resume_break_address) ! 460: { ! 461: stop_step_resume_break = 1; ! 462: if (DECR_PC_AFTER_BREAK) ! 463: { ! 464: stop_pc -= DECR_PC_AFTER_BREAK; ! 465: write_register (PC_REGNUM, stop_pc); ! 466: pc_changed = 0; ! 467: } ! 468: } ! 469: ! 470: if (stop_signal == SIGTRAP) ! 471: random_signal ! 472: = !(stop_breakpoint || trap_expected ! 473: || stop_step_resume_break ! 474: || (stop_sp INNER_THAN stop_pc && stop_pc INNER_THAN stop_frame) ! 475: || (step_range_end && !step_resume_break_address)); ! 476: else ! 477: { ! 478: random_signal ! 479: = !(stop_breakpoint || stop_step_resume_break); ! 480: if (!random_signal) ! 481: stop_signal = SIGTRAP; ! 482: } ! 483: } ! 484: else ! 485: random_signal = 1; ! 486: ! 487: /* For the program's own signals, act according to ! 488: the signal handling tables. */ ! 489: ! 490: if (random_signal ! 491: && !(running_in_shell && stop_signal == SIGSEGV)) ! 492: { ! 493: /* Signal not for debugging purposes. */ ! 494: int printed = 0; ! 495: ! 496: if (stop_signal >= NSIG ! 497: || signal_print[stop_signal]) ! 498: { ! 499: printed = 1; ! 500: terminal_ours_for_output (); ! 501: printf ("\nProgram received signal %d, %s\n", ! 502: stop_signal, ! 503: stop_signal < NSIG ! 504: ? sys_siglist[stop_signal] ! 505: : "(undocumented)"); ! 506: fflush (stdout); ! 507: } ! 508: if (stop_signal >= NSIG ! 509: || signal_stop[stop_signal]) ! 510: break; ! 511: /* If not going to stop, give terminal back ! 512: if we took it away. */ ! 513: else if (printed) ! 514: terminal_inferior (); ! 515: } ! 516: ! 517: /* Handle cases caused by hitting a breakpoint. */ ! 518: ! 519: if (!random_signal ! 520: && (stop_breakpoint || stop_step_resume_break)) ! 521: { ! 522: /* Does a breakpoint want us to stop? */ ! 523: if (stop_breakpoint && stop_breakpoint != -1) ! 524: { ! 525: /* 0x1000000 is set in stop_breakpoint as returned by ! 526: breakpoint_status_p to indicate a silent breakpoint. */ ! 527: if (stop_breakpoint > 0 && stop_breakpoint & 0x1000000) ! 528: { ! 529: stop_breakpoint &= ~0x1000000; ! 530: stop_print_frame = 0; ! 531: } ! 532: break; ! 533: } ! 534: /* But if we have hit the step-resumption breakpoint, ! 535: remove it. It has done its job getting us here. */ ! 536: if (stop_step_resume_break ! 537: && (step_frame == 0 || stop_frame == step_frame)) ! 538: { ! 539: remove_step_breakpoint (); ! 540: step_resume_break_address = 0; ! 541: } ! 542: /* Otherwise, must remove breakpoints and single-step ! 543: to get us past the one we hit. */ ! 544: else ! 545: { ! 546: remove_breakpoints (); ! 547: remove_step_breakpoint (); ! 548: breakpoints_inserted = 0; ! 549: another_trap = 1; ! 550: } ! 551: ! 552: /* We come here if we hit a breakpoint but should not ! 553: stop for it. Possibly we also were stepping ! 554: and should stop for that. So fall through and ! 555: test for stepping. But, if not stepping, ! 556: do not stop. */ ! 557: } ! 558: ! 559: /* If this is the breakpoint at the end of a stack dummy, ! 560: just stop silently. */ ! 561: if (stop_sp INNER_THAN stop_pc && stop_pc INNER_THAN stop_frame) ! 562: { ! 563: stop_print_frame = 0; ! 564: stop_stack_dummy = 1; ! 565: #ifdef HP9K320 ! 566: trap_expected_after_continue = 1; ! 567: #endif ! 568: break; ! 569: } ! 570: ! 571: if (step_resume_break_address) ! 572: /* Having a step-resume breakpoint overrides anything ! 573: else having to do with stepping commands until ! 574: that breakpoint is reached. */ ! 575: ; ! 576: /* If stepping through a line, keep going if still within it. */ ! 577: else if (!random_signal ! 578: && step_range_end ! 579: && stop_pc >= step_range_start ! 580: && stop_pc < step_range_end) ! 581: { ! 582: /* Don't step through the return from a function ! 583: unless that is the first instruction stepped through. */ ! 584: if (ABOUT_TO_RETURN (stop_pc)) ! 585: { ! 586: stop_step = 1; ! 587: break; ! 588: } ! 589: } ! 590: ! 591: /* We stepped out of the stepping range. See if that was due ! 592: to a subroutine call that we should proceed to the end of. */ ! 593: else if (!random_signal && step_range_end) ! 594: { ! 595: newfun = find_pc_function (stop_pc); ! 596: newmisc = -1; ! 597: if (newfun) ! 598: { ! 599: newfun_pc = BLOCK_START (SYMBOL_BLOCK_VALUE (newfun)) ! 600: + FUNCTION_START_OFFSET; ! 601: } ! 602: else ! 603: { ! 604: newmisc = find_pc_misc_function (stop_pc); ! 605: if (newmisc >= 0) ! 606: newfun_pc = misc_function_vector[newmisc].address ! 607: + FUNCTION_START_OFFSET; ! 608: else newfun_pc = 0; ! 609: } ! 610: if (stop_pc == newfun_pc ! 611: && (step_over_calls > 0 || (step_over_calls && newfun == 0))) ! 612: { ! 613: /* A subroutine call has happened. */ ! 614: /* Set a special breakpoint after the return */ ! 615: step_resume_break_address = SAVED_PC_AFTER_CALL (stop_frame); ! 616: step_resume_break_duplicate ! 617: = breakpoint_here_p (step_resume_break_address); ! 618: if (breakpoints_inserted) ! 619: insert_step_breakpoint (); ! 620: } ! 621: /* Subroutine call with source code we should not step over. ! 622: Do step to the first line of code in it. */ ! 623: else if (stop_pc == newfun_pc && step_over_calls) ! 624: { ! 625: SKIP_PROLOGUE (newfun_pc); ! 626: sal = find_pc_line (newfun_pc, 0); ! 627: /* Use the step_resume_break to step until ! 628: the end of the prologue, even if that involves jumps ! 629: (as it seems to on the vax under 4.2). */ ! 630: /* If the prologue ends in the middle of a source line, ! 631: continue to the end of that source line. ! 632: Otherwise, just go to end of prologue. */ ! 633: if (sal.end && sal.pc != newfun_pc) ! 634: newfun_pc = sal.end; ! 635: ! 636: if (newfun_pc == stop_pc) ! 637: /* We are already there: stop now. */ ! 638: stop_step = 1; ! 639: else ! 640: /* Put the step-breakpoint there and go until there. */ ! 641: { ! 642: step_resume_break_address = newfun_pc; ! 643: ! 644: step_resume_break_duplicate ! 645: = breakpoint_here_p (step_resume_break_address); ! 646: if (breakpoints_inserted) ! 647: insert_step_breakpoint (); ! 648: /* Do not specify what the fp should be when we stop ! 649: since on some machines the prologue ! 650: is where the new fp value is established. */ ! 651: step_frame = 0; ! 652: /* And make sure stepping stops right away then. */ ! 653: step_range_end = step_range_start; ! 654: } ! 655: } ! 656: /* No subroutince call; stop now. */ ! 657: else ! 658: { ! 659: stop_step = 1; ! 660: break; ! 661: } ! 662: } ! 663: } ! 664: ! 665: /* Save the pc before execution, to compare with pc after stop. */ ! 666: prev_pc = read_pc (); ! 667: ! 668: /* If we did not do break;, it means we should keep ! 669: running the inferior and not return to debugger. */ ! 670: ! 671: /* If trap_expected is 2, it means continue once more ! 672: and insert breakpoints at the next trap. ! 673: If trap_expected is 1 and the signal was SIGSEGV, it means ! 674: the shell is doing some memory allocation--just resume it ! 675: with SIGSEGV. ! 676: Otherwise insert breakpoints now, and possibly single step. */ ! 677: ! 678: if (trap_expected > 1) ! 679: { ! 680: trap_expected--; ! 681: running_in_shell = 1; ! 682: resume (0, 0); ! 683: } ! 684: else if (running_in_shell && stop_signal == SIGSEGV) ! 685: { ! 686: resume (0, SIGSEGV); ! 687: } ! 688: else ! 689: { ! 690: /* Here, we are not awaiting another exec to get ! 691: the program we really want to debug. ! 692: Insert breakpoints now, unless we are trying ! 693: to one-proceed past a breakpoint. */ ! 694: running_in_shell = 0; ! 695: if (!breakpoints_inserted && !another_trap) ! 696: { ! 697: insert_step_breakpoint (); ! 698: breakpoints_failed = insert_breakpoints (); ! 699: if (breakpoints_failed) ! 700: break; ! 701: breakpoints_inserted = 1; ! 702: } ! 703: ! 704: trap_expected = another_trap; ! 705: ! 706: if (stop_signal == SIGTRAP) ! 707: stop_signal = 0; ! 708: ! 709: resume ((step_range_end && !step_resume_break_address) ! 710: || trap_expected, ! 711: stop_signal); ! 712: } ! 713: } ! 714: } ! 715: ! 716: /* Here to return control to GDB when the inferior stops for real. ! 717: Print appropriate messages, remove breakpoints, give terminal our modes. ! 718: ! 719: RUNNING_IN_SHELL nonzero means the shell got a signal before ! 720: exec'ing the program we wanted to run. ! 721: STOP_PRINT_FRAME nonzero means print the executing frame ! 722: (pc, function, args, file, line number and line text). ! 723: BREAKPOINTS_FAILED nonzero means stop was due to error ! 724: attempting to insert breakpoints. */ ! 725: ! 726: static void ! 727: normal_stop () ! 728: { ! 729: if (breakpoints_failed) ! 730: { ! 731: terminal_ours_for_output (); ! 732: print_sys_errmsg ("ptrace", breakpoints_failed); ! 733: printf ("Stopped; cannot insert breakpoints.\n\ ! 734: The same program may be running in another process.\n"); ! 735: } ! 736: ! 737: if (inferior_pid) ! 738: remove_step_breakpoint (); ! 739: ! 740: if (inferior_pid && breakpoints_inserted) ! 741: if (remove_breakpoints ()) ! 742: { ! 743: terminal_ours_for_output (); ! 744: printf ("Cannot remove breakpoints because program is no longer writable.\n\ ! 745: It must be running in another process.\n\ ! 746: Further execution is probably impossible.\n"); ! 747: } ! 748: ! 749: breakpoints_inserted = 0; ! 750: ! 751: /* Delete the breakpoint we stopped at, if it wants to be deleted. ! 752: Delete any breakpoint that is to be deleted at the next stop. */ ! 753: ! 754: breakpoint_auto_delete (stop_breakpoint); ! 755: ! 756: /* If an auto-display called a function and that got a signal, ! 757: delete that auto-display to avoid an infinite recursion. */ ! 758: ! 759: delete_current_display (); ! 760: ! 761: if (step_multi && stop_step) ! 762: return; ! 763: ! 764: terminal_ours (); ! 765: ! 766: if (running_in_shell) ! 767: { ! 768: if (stop_signal == SIGSEGV) ! 769: { ! 770: char *exec_file = (char *) get_exec_file (1); ! 771: ! 772: if (access (exec_file, X_OK) != 0) ! 773: printf ("The file \"%s\" is not executable.\n", exec_file); ! 774: else ! 775: printf ("\ ! 776: You have just encountered a bug in \"sh\". GDB starts your program\n\ ! 777: by running \"sh\" with a command to exec your program.\n\ ! 778: This is so that \"sh\" will process wildcards and I/O redirection.\n\ ! 779: This time, \"sh\" crashed.\n\ ! 780: \n\ ! 781: One known bug in \"sh\" bites when the environment takes up a lot of space.\n\ ! 782: Try \"info env\" to see the environment; then use \"unset-env\" to kill\n\ ! 783: some variables whose values are large; then do \"run\" again.\n\ ! 784: \n\ ! 785: If that works, you might want to put those \"unset-env\" commands\n\ ! 786: into a \".gdbinit\" file in this directory so they will happen every time.\n"); ! 787: } ! 788: /* Don't confuse user with his program's symbols on sh's data. */ ! 789: stop_print_frame = 0; ! 790: } ! 791: ! 792: if (inferior_pid == 0) ! 793: return; ! 794: ! 795: /* Select innermost stack frame except on return from a stack dummy routine, ! 796: or if the program has exited. */ ! 797: if (!stop_stack_dummy) ! 798: { ! 799: select_frame (stop_frame, 0); ! 800: ! 801: if (stop_print_frame) ! 802: { ! 803: if (stop_breakpoint > 0) ! 804: printf ("\nBpt %d, ", stop_breakpoint); ! 805: print_sel_frame (stop_step ! 806: && step_frame == stop_frame ! 807: && step_start_function == find_pc_function (stop_pc)); ! 808: /* Display the auto-display expressions. */ ! 809: do_displays (); ! 810: } ! 811: } ! 812: ! 813: /* Save the function value return registers ! 814: We might be about to restore their previous contents. */ ! 815: read_register_bytes (0, stop_registers, REGISTER_BYTES); ! 816: ! 817: if (stop_stack_dummy) ! 818: { ! 819: /* Pop the empty frame that contains the stack dummy. */ ! 820: POP_FRAME; ! 821: select_frame (read_register (FP_REGNUM), 0); ! 822: } ! 823: } ! 824: ! 825: static void ! 826: insert_step_breakpoint () ! 827: { ! 828: if (step_resume_break_address && !step_resume_break_duplicate) ! 829: { ! 830: read_memory (step_resume_break_address, ! 831: step_resume_break_shadow, sizeof break_insn); ! 832: write_memory (step_resume_break_address, ! 833: break_insn, sizeof break_insn); ! 834: } ! 835: } ! 836: ! 837: static void ! 838: remove_step_breakpoint () ! 839: { ! 840: if (step_resume_break_address && !step_resume_break_duplicate) ! 841: write_memory (step_resume_break_address, step_resume_break_shadow, ! 842: sizeof break_insn); ! 843: } ! 844: ! 845: /* Specify how various signals in the inferior should be handled. */ ! 846: ! 847: static void ! 848: handle_command (args, from_tty) ! 849: char *args; ! 850: int from_tty; ! 851: { ! 852: register char *p = args; ! 853: int signum; ! 854: register int digits, wordlen; ! 855: ! 856: if (!args) ! 857: error_no_arg ("signal to handle"); ! 858: ! 859: while (*p) ! 860: { ! 861: /* Find the end of the next word in the args. */ ! 862: for (wordlen = 0; p[wordlen] && p[wordlen] != ' ' && p[wordlen] != '\t'; ! 863: wordlen++); ! 864: for (digits = 0; p[digits] >= '0' && p[digits] <= '9'; digits++); ! 865: ! 866: /* If it is all digits, it is signal number to operate on. */ ! 867: if (digits == wordlen) ! 868: { ! 869: signum = atoi (p); ! 870: if (signum == SIGTRAP || signum == SIGINT) ! 871: { ! 872: if (!query ("Signal %d is used by the debugger.\nAre you sure you want to change it? ", signum)) ! 873: error ("Not confirmed."); ! 874: } ! 875: } ! 876: else if (signum == 0) ! 877: error ("First argument is not a signal number."); ! 878: ! 879: /* Else, if already got a signal number, look for flag words ! 880: saying what to do for it. */ ! 881: else if (!strncmp (p, "stop", wordlen)) ! 882: { ! 883: signal_stop[signum] = 1; ! 884: signal_print[signum] = 1; ! 885: } ! 886: else if (wordlen >= 2 && !strncmp (p, "print", wordlen)) ! 887: signal_print[signum] = 1; ! 888: else if (wordlen >= 2 && !strncmp (p, "pass", wordlen)) ! 889: signal_program[signum] = 1; ! 890: else if (!strncmp (p, "ignore", wordlen)) ! 891: signal_program[signum] = 0; ! 892: else if (wordlen >= 3 && !strncmp (p, "nostop", wordlen)) ! 893: signal_stop[signum] = 0; ! 894: else if (wordlen >= 4 && !strncmp (p, "noprint", wordlen)) ! 895: { ! 896: signal_print[signum] = 0; ! 897: signal_stop[signum] = 0; ! 898: } ! 899: else if (wordlen >= 4 && !strncmp (p, "nopass", wordlen)) ! 900: signal_program[signum] = 0; ! 901: else if (wordlen >= 3 && !strncmp (p, "noignore", wordlen)) ! 902: signal_program[signum] = 1; ! 903: /* Not a number and not a recognized flag word => complain. */ ! 904: else ! 905: { ! 906: p[wordlen] = 0; ! 907: error ("Unrecognized flag word: \"%s\".", p); ! 908: } ! 909: ! 910: /* Find start of next word. */ ! 911: p += wordlen; ! 912: while (*p == ' ' || *p == '\t') p++; ! 913: } ! 914: ! 915: if (from_tty) ! 916: { ! 917: /* Show the results. */ ! 918: printf ("Number\tStop\tPrint\tPass to program\tDescription\n"); ! 919: printf ("%d\t", signum); ! 920: printf ("%s\t", signal_stop[signum] ? "Yes" : "No"); ! 921: printf ("%s\t", signal_print[signum] ? "Yes" : "No"); ! 922: printf ("%s\t\t", signal_program[signum] ? "Yes" : "No"); ! 923: printf ("%s\n", sys_siglist[signum]); ! 924: } ! 925: } ! 926: ! 927: /* Print current contents of the tables set by the handle command. */ ! 928: ! 929: static void ! 930: signals_info (signum_exp) ! 931: char *signum_exp; ! 932: { ! 933: register int i; ! 934: printf ("Number\tStop\tPrint\tPass to program\tDescription\n"); ! 935: ! 936: if (signum_exp) ! 937: { ! 938: i = parse_and_eval_address (signum_exp); ! 939: printf ("%d\t", i); ! 940: printf ("%s\t", signal_stop[i] ? "Yes" : "No"); ! 941: printf ("%s\t", signal_print[i] ? "Yes" : "No"); ! 942: printf ("%s\t\t", signal_program[i] ? "Yes" : "No"); ! 943: printf ("%s\n", sys_siglist[i]); ! 944: return; ! 945: } ! 946: ! 947: printf ("\n"); ! 948: for (i = 0; i < NSIG; i++) ! 949: { ! 950: QUIT; ! 951: if (i > 0 && i % 16 == 0) ! 952: { ! 953: printf ("[Type Return to see more]"); ! 954: fflush (stdout); ! 955: read_line (); ! 956: } ! 957: printf ("%d\t", i); ! 958: printf ("%s\t", signal_stop[i] ? "Yes" : "No"); ! 959: printf ("%s\t", signal_print[i] ? "Yes" : "No"); ! 960: printf ("%s\t\t", signal_program[i] ? "Yes" : "No"); ! 961: printf ("%s\n", sys_siglist[i]); ! 962: } ! 963: ! 964: printf ("\nUse the \"handle\" command to change these tables.\n"); ! 965: } ! 966: ! 967: static ! 968: initialize () ! 969: { ! 970: register int i; ! 971: ! 972: add_info ("signals", signals_info, ! 973: "What debugger does when program gets various signals.\n\ ! 974: Specify a signal number as argument to print info on that signal only."); ! 975: ! 976: add_com ("handle", class_run, handle_command, ! 977: "Specify how to handle a signal.\n\ ! 978: Args are signal number followed by flags.\n\ ! 979: Flags allowed are \"stop\", \"print\", \"pass\",\n\ ! 980: \"nostop\", \"noprint\" or \"nopass\".\n\ ! 981: Print means print a message if this signal happens.\n\ ! 982: Stop means reenter debugger if this signal happens (implies print).\n\ ! 983: Pass means let program see this signal; otherwise program doesn't know.\n\ ! 984: Pass and Stop may be combined."); ! 985: ! 986: for (i = 0; i < NSIG; i++) ! 987: { ! 988: signal_stop[i] = 1; ! 989: signal_print[i] = 1; ! 990: signal_program[i] = 1; ! 991: } ! 992: ! 993: /* Signals caused by debugger's own actions ! 994: should not be given to the program afterwards. */ ! 995: signal_program[SIGTRAP] = 0; ! 996: signal_program[SIGINT] = 0; ! 997: ! 998: /* Signals that are not errors should not normally enter the debugger. */ ! 999: #ifdef SIGALRM ! 1000: signal_stop[SIGALRM] = 0; ! 1001: signal_print[SIGALRM] = 0; ! 1002: #endif /* SIGALRM */ ! 1003: #ifdef SIGVTALRM ! 1004: signal_stop[SIGVTALRM] = 0; ! 1005: signal_print[SIGVTALRM] = 0; ! 1006: #endif /* SIGVTALRM */ ! 1007: #ifdef SIGPROF ! 1008: signal_stop[SIGPROF] = 0; ! 1009: signal_print[SIGPROF] = 0; ! 1010: #endif /* SIGPROF */ ! 1011: #ifdef SIGCHLD ! 1012: signal_stop[SIGCHLD] = 0; ! 1013: signal_print[SIGCHLD] = 0; ! 1014: #endif /* SIGCHLD */ ! 1015: #ifdef SIGCLD ! 1016: signal_stop[SIGCLD] = 0; ! 1017: signal_print[SIGCLD] = 0; ! 1018: #endif /* SIGCLD */ ! 1019: #ifdef SIGIO ! 1020: signal_stop[SIGIO] = 0; ! 1021: signal_print[SIGIO] = 0; ! 1022: #endif /* SIGIO */ ! 1023: #ifdef SIGURG ! 1024: signal_stop[SIGURG] = 0; ! 1025: signal_print[SIGURG] = 0; ! 1026: #endif /* SIGURG */ ! 1027: } ! 1028: ! 1029: END_FILE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.