📄 inflow.c
字号:
#endif#ifdef HAVE_TERMIO sg_ours.c_lflag |= ICANON;#else /* not HAVE_TERMIO */ sg_ours.sg_flags &= ~RAW & ~CBREAK;#endif /* not HAVE_TERMIO */ result = result; /* lint */#endif}/* ARGSUSED */voidterm_info (arg, from_tty) char *arg; int from_tty;{ target_terminal_info (arg, from_tty);}/* ARGSUSED */voidchild_terminal_info (args, from_tty) char *args; int from_tty;{ register int i; if (!gdb_has_a_terminal) { printf_filtered ("This GDB does not control a terminal.\n"); return; }#if !defined(__GO32__)#ifdef TIOCGPGRP printf_filtered ("Inferior's terminal status (currently saved by GDB):\n"); printf_filtered ("owner pgrp = %d, fcntl flags = 0x%x.\n", pgrp_inferior, tflags_inferior);#endif /* TIOCGPGRP */#ifdef HAVE_TERMIO printf_filtered ("c_iflag = 0x%x, c_oflag = 0x%x,\n", sg_inferior.c_iflag, sg_inferior.c_oflag); printf_filtered ("c_cflag = 0x%x, c_lflag = 0x%x, c_line = 0x%x.\n", sg_inferior.c_cflag, sg_inferior.c_lflag, sg_inferior.c_line); printf_filtered ("c_cc: "); for (i = 0; (i < NCC); i += 1) printf_filtered ("0x%x ", sg_inferior.c_cc[i]); printf_filtered ("\n");#else /* not HAVE_TERMIO */ printf_filtered ("sgttyb.sg_flags = 0x%x.\n", sg_inferior.sg_flags);#endif /* not HAVE_TERMIO */#if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN) printf_filtered ("tchars: "); for (i = 0; i < (int)sizeof (struct tchars); i++) printf_filtered ("0x%x ", ((unsigned char *)&tc_inferior)[i]); printf_filtered ("\n");#endif#if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN) printf_filtered ("ltchars: "); for (i = 0; i < (int)sizeof (struct ltchars); i++) printf_filtered ("0x%x ", ((unsigned char *)<c_inferior)[i]); printf_filtered ("\n");#endif #ifdef TIOCLGET printf_filtered ("lmode: 0x%x\n", lmode_inferior);#endif#else printf_filtered("This is a DOS machine; there is no terminal state\n");#endif}/* NEW_TTY_PREFORK is called before forking a new child process, so we can record the state of ttys in the child to be formed. TTYNAME is null if we are to share the terminal with gdb; or points to a string containing the name of the desired tty. NEW_TTY is called in new child processes under Unix, which will become debugger target processes. This actually switches to the terminal specified in the NEW_TTY_PREFORK call. */voidnew_tty_prefork (ttyname) char *ttyname;{ /* Save the name for later, for determining whether we and the child are sharing a tty. */ inferior_thisrun_terminal = ttyname;}voidnew_tty (){ register int tty; void (*osigttou) (); if (inferior_thisrun_terminal == 0) return;#if !defined(__GO32__)#ifdef TIOCNOTTY /* Disconnect the child process from our controlling terminal. On some systems (SVR4 for example), this may cause a SIGTTOU, so temporarily ignore SIGTTOU. */ tty = open("/dev/tty", O_RDWR); if (tty > 0) { osigttou = (void (*)()) signal(SIGTTOU, SIG_IGN); ioctl(tty, TIOCNOTTY, 0); close(tty); signal(SIGTTOU, osigttou); }#endif /* Now open the specified new terminal. */#ifdef USE_O_NOCTTY tty = open(inferior_thisrun_terminal, O_RDWR | O_NOCTTY);#else tty = open(inferior_thisrun_terminal, O_RDWR);#endif if (tty == -1) { print_sys_errmsg (inferior_thisrun_terminal, errno); _exit(1); } /* Avoid use of dup2; doesn't exist on all systems. */ if (tty != 0) { close (0); dup (tty); } if (tty != 1) { close (1); dup (tty); } if (tty != 2) { close (2); dup (tty); } if (tty > 2) close(tty);#endif /* !go32*/o}/* Kill the inferior process. Make us have no inferior. *//* ARGSUSED */static voidkill_command (arg, from_tty) char *arg; int from_tty;{ if (inferior_pid == 0) error ("The program is not being run."); if (!query ("Kill the inferior process? ")) error ("Not confirmed."); target_kill (); /* Killing off the inferior can leave us with a core file. If so, print the state we are left in. */ if (target_has_stack) { printf_filtered ("In %s,\n", current_target->to_longname); if (selected_frame == NULL) fputs_filtered ("No selected stack frame.\n", stdout); else print_stack_frame (selected_frame, selected_frame_level, 1); }}/* The inferior process has died. Long live the inferior! */voidgeneric_mourn_inferior (){ inferior_pid = 0; attach_flag = 0; mark_breakpoints_out (); registers_changed ();#ifdef CLEAR_DEFERRED_STORES /* Delete any pending stores to the inferior... */ CLEAR_DEFERRED_STORES;#endif reopen_exec_file (); if (target_has_stack) { set_current_frame ( create_new_frame (read_register (FP_REGNUM), read_pc ())); select_frame (get_current_frame (), 0); } else { set_current_frame (0); select_frame ((FRAME) 0, -1); } /* It is confusing to the user for ignore counts to stick around from previous runs of the inferior. So clear them. */ breakpoint_clear_ignore_counts ();}#if 0 /* This function is just for testing, and on some systems (Sony NewsOS 3.2) <sys/user.h> also includes <sys/time.h> which leads to errors (since on this system at least sys/time.h is not protected against multiple inclusion). *//* ARGSUSED */static voidtry_writing_regs_command (arg, from_tty) char *arg; int from_tty;{ register int i; register int value; if (inferior_pid == 0) error ("There is no inferior process now."); /* A Sun 3/50 or 3/60 (at least) running SunOS 4.0.3 will have a kernel panic if we try to write past the end of the user area. Presumably Sun will fix this bug (it has been reported), but it is tacky to crash the system, so at least on SunOS4 we need to stop writing when we hit the end of the user area. */ for (i = 0; i < sizeof (struct user); i += 2) { QUIT; errno = 0; value = call_ptrace (3, inferior_pid, (PTRACE_ARG3_TYPE) i, 0); call_ptrace (6, inferior_pid, (PTRACE_ARG3_TYPE) i, value); if (errno == 0) { printf (" Succeeded with address 0x%x; value 0x%x (%d).\n", i, value, value); } else if ((i & 0377) == 0) printf (" Failed at 0x%x.\n", i); }}#endifvoid_initialize_inflow (){ int result; add_info ("terminal", term_info, "Print inferior's saved terminal status.");#if 0 add_com ("try-writing-regs", class_obscure, try_writing_regs_command, "Try writing all locations in inferior's system block.\n\Report which ones can be written.");#endif add_com ("kill", class_run, kill_command, "Kill execution of program being debugged."); inferior_pid = 0; /* Get all the current tty settings (including whether we have a tty at all!). */#if !defined(__GO32__) tflags_ours = fcntl (0, F_GETFL, 0); result = ioctl (0, TIOCGETP, &sg_ours); if (result == 0) { gdb_has_a_terminal = 1; /* Get the rest of the tty settings, then... */#if defined(TIOCGETC) && !defined(TIOCGETC_BROKEN) ioctl (0, TIOCGETC, &tc_ours);#endif#if defined(TIOCGLTC) && !defined(TIOCGLTC_BROKEN) ioctl (0, TIOCGLTC, <c_ours);#endif#ifdef TIOCLGET result = ioctl (0, TIOCLGET, &lmode_ours); lmode_ours_valid = (result == 0);#endif#ifdef TIOCGPGRP ioctl (0, TIOCGPGRP, &pgrp_ours);#endif /* TIOCGPGRP */ } else { gdb_has_a_terminal = 0; }#else gdb_has_a_terminal = 0;#endif terminal_is_ours = 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -