static int readchar (int timeout) { int c; do { c = serial_readchar (e7000_desc, timeout); } while (c > 127); if (c == SERIAL_TIMEOUT) { if (timeout == 0) return -1; echo = 0; error (_("Timeout reading from remote system.")); } else if (c < 0) error (_("Serial communication error")); if (remote_debug) { putchar_unfiltered (c); gdb_flush (gdb_stdout); } return normal (c); }
static void async_stop_sig (gdb_client_data arg) { char *prompt = get_prompt (); #if STOP_SIGNAL == SIGTSTP signal (SIGTSTP, SIG_DFL); #if HAVE_SIGPROCMASK { sigset_t zero; sigemptyset (&zero); sigprocmask (SIG_SETMASK, &zero, 0); } #elif HAVE_SIGSETMASK sigsetmask (0); #endif kill (getpid (), SIGTSTP); signal (SIGTSTP, handle_stop_sig); #else signal (STOP_SIGNAL, handle_stop_sig); #endif printf_unfiltered ("%s", prompt); gdb_flush (gdb_stdout); /* Forget about any previous command -- null line now will do nothing. */ dont_repeat (); }
static void mi_breakpoint_modified (struct breakpoint *b) { struct mi_interp *mi = top_level_interpreter_data (); struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ()); volatile struct gdb_exception e; if (mi_suppress_notification.breakpoint) return; if (b->number <= 0) return; target_terminal_ours (); fprintf_unfiltered (mi->event_channel, "breakpoint-modified"); /* We want the output from gdb_breakpoint_query to go to mi->event_channel. One approach would be to just call gdb_breakpoint_query, and then use mi_out_put to send the current content of mi_outout into mi->event_channel. However, that will break if anything is output to mi_uiout prior to calling the breakpoint_created notifications. So, we use ui_out_redirect. */ ui_out_redirect (mi_uiout, mi->event_channel); TRY_CATCH (e, RETURN_MASK_ERROR) gdb_breakpoint_query (mi_uiout, b->number, NULL); ui_out_redirect (mi_uiout, NULL); gdb_flush (mi->event_channel); }
static void inf_ptrace_attach (struct target_ops *ops, const char *args, int from_tty) { char *exec_file; pid_t pid; struct inferior *inf; /* Do not change either targets above or the same target if already present. The reason is the target stack is shared across multiple inferiors. */ int ops_already_pushed = target_is_pushed (ops); struct cleanup *back_to = make_cleanup (null_cleanup, NULL); pid = parse_pid_to_attach (args); if (pid == getpid ()) /* Trying to m********e? */ error (_("I refuse to debug myself!")); if (! ops_already_pushed) { /* target_pid_to_str already uses the target. Also clear possible core file with its process_stratum. */ push_target (ops); make_cleanup_unpush_target (ops); } if (from_tty) { exec_file = get_exec_file (0); if (exec_file) printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file, target_pid_to_str (pid_to_ptid (pid))); else printf_unfiltered (_("Attaching to %s\n"), target_pid_to_str (pid_to_ptid (pid))); gdb_flush (gdb_stdout); } #ifdef PT_ATTACH errno = 0; ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3)0, 0); if (errno != 0) perror_with_name (("ptrace")); #else error (_("This system does not support attaching to a process")); #endif inf = current_inferior (); inferior_appeared (inf, pid); inf->attach_flag = 1; inferior_ptid = pid_to_ptid (pid); /* Always add a main thread. If some target extends the ptrace target, it should decorate the ptid later with more info. */ add_thread_silent (inferior_ptid); discard_cleanups (back_to); }
static void cli_flush (struct ui_out *uiout) { cli_out_data *data = (cli_out_data *) ui_out_data (uiout); struct ui_file *stream = data->streams.back (); gdb_flush (stream); }
static void cli_flush (struct ui_out *uiout) { cli_out_data *data = ui_out_data (uiout); struct ui_file *stream = VEC_last (ui_filep, data->streams); gdb_flush (stream); }
static void mi_execute_command_input_handler (char *cmd) { mi_execute_command_wrapper (cmd); fputs_unfiltered ("(gdb) \n", raw_stdout); gdb_flush (raw_stdout); }
static void mi_on_normal_stop (struct bpstats *bs, int print_frame) { /* Since this can be called when CLI command is executing, using cli interpreter, be sure to use MI uiout for output, not the current one. */ struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ()); if (print_frame) { int core; if (current_uiout != mi_uiout) { /* The normal_stop function has printed frame information into CLI uiout, or some other non-MI uiout. There's no way we can extract proper fields from random uiout object, so we print the frame again. In practice, this can only happen when running a CLI command in MI. */ struct ui_out *saved_uiout = current_uiout; struct target_waitstatus last; ptid_t last_ptid; current_uiout = mi_uiout; get_last_target_status (&last_ptid, &last); bpstat_print (bs, last.kind); print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC, 1); current_uiout = saved_uiout; } ui_out_field_int (mi_uiout, "thread-id", pid_to_thread_id (inferior_ptid)); if (non_stop) { struct cleanup *back_to = make_cleanup_ui_out_list_begin_end (mi_uiout, "stopped-threads"); ui_out_field_int (mi_uiout, NULL, pid_to_thread_id (inferior_ptid)); do_cleanups (back_to); } else ui_out_field_string (mi_uiout, "stopped-threads", "all"); core = target_core_of_thread (inferior_ptid); if (core != -1) ui_out_field_int (mi_uiout, "core", core); } fputs_unfiltered ("*stopped", raw_stdout); mi_out_put (mi_uiout, raw_stdout); mi_out_rewind (mi_uiout); mi_print_timing_maybe (); fputs_unfiltered ("\n", raw_stdout); gdb_flush (raw_stdout); }
static void print_flush (void) { struct ui *ui = current_ui; struct serial *gdb_stdout_serial; if (deprecated_error_begin_hook) deprecated_error_begin_hook (); gdb::optional<target_terminal::scoped_restore_terminal_state> term_state; /* While normally there's always something pushed on the target stack, the NULL check is needed here because we can get here very early during startup, before the target stack is first initialized. */ if (current_top_target () != NULL && target_supports_terminal_ours ()) { term_state.emplace (); target_terminal::ours_for_output (); } /* We want all output to appear now, before we print the error. We have 3 levels of buffering we have to flush (it's possible that some of these should be changed to flush the lower-level ones too): */ /* 1. The _filtered buffer. */ if (filtered_printing_initialized ()) wrap_here (""); /* 2. The stdio buffer. */ gdb_flush (gdb_stdout); gdb_flush (gdb_stderr); /* 3. The system-level buffer. */ gdb_stdout_serial = serial_fdopen (fileno (ui->outstream)); if (gdb_stdout_serial) { serial_drain_output (gdb_stdout_serial); serial_un_fdopen (gdb_stdout_serial); } annotate_error_begin (); }
static void mi_record_changed (struct inferior *inferior, int started) { struct mi_interp *mi = top_level_interpreter_data (); fprintf_unfiltered (mi->event_channel, "record-%s,thread-group=\"i%d\"", started ? "started" : "stopped", inferior->num); gdb_flush (mi->event_channel); }
static void mi_command_loop (int mi_version) { /* Turn off 8 bit strings in quoted output. Any character with the high bit set is printed using C's octal format. */ sevenbit_strings = 1; /* Tell the world that we're alive */ fputs_unfiltered ("(gdb) \n", raw_stdout); gdb_flush (raw_stdout); start_event_loop (); }
static void mi_inferior_removed (struct inferior *inf) { struct mi_interp *mi = top_level_interpreter_data (); target_terminal_ours (); fprintf_unfiltered (mi->event_channel, "thread-group-removed,id=\"i%d\"", inf->num); gdb_flush (mi->event_channel); }
static void mi_on_sync_execution_done (void) { /* If MI is sync, then output the MI prompt now, indicating we're ready for further input. */ if (!mi_async_p ()) { fputs_unfiltered ("(gdb) \n", raw_stdout); gdb_flush (raw_stdout); } }
static void inf_ptrace_attach (struct target_ops *ops, char *args, int from_tty) { char *exec_file; pid_t pid; char *dummy; struct inferior *inf; if (!args) error_no_arg (_("process-id to attach")); dummy = args; pid = strtol (args, &dummy, 0); /* Some targets don't set errno on errors, grrr! */ if (pid == 0 && args == dummy) error (_("Illegal process-id: %s."), args); if (pid == getpid ()) /* Trying to m********e? */ error (_("I refuse to debug myself!")); if (from_tty) { exec_file = get_exec_file (0); if (exec_file) printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file, target_pid_to_str (pid_to_ptid (pid))); else printf_unfiltered (_("Attaching to %s\n"), target_pid_to_str (pid_to_ptid (pid))); gdb_flush (gdb_stdout); } #ifdef PT_ATTACH errno = 0; ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3)0, 0); if (errno != 0) perror_with_name (("ptrace")); #else error (_("This system does not support attaching to a process")); #endif inferior_ptid = pid_to_ptid (pid); inf = add_inferior (pid); inf->attach_flag = 1; /* Always add a main thread. If some target extends the ptrace target, it should decorate the ptid later with more info. */ add_thread_silent (inferior_ptid); push_target(ops); }
void mi_exec_async_cli_cmd_continuation (struct continuation_arg *arg) { if (last_async_command) fputs_unfiltered (last_async_command, raw_stdout); fputs_unfiltered ("*stopped", raw_stdout); mi_out_put (uiout, raw_stdout); fputs_unfiltered ("\n", raw_stdout); fputs_unfiltered ("(gdb) \n", raw_stdout); gdb_flush (raw_stdout); do_exec_cleanups (ALL_CLEANUPS); }
void mi_execute_command (char *cmd, int from_tty) { struct mi_parse *command; struct captured_mi_execute_command_args args; struct ui_out *saved_uiout = uiout; /* This is to handle EOF (^D). We just quit gdb. */ /* FIXME: we should call some API function here. */ if (cmd == 0) quit_force (NULL, from_tty); command = mi_parse (cmd); if (command != NULL) { struct gdb_exception result; /* FIXME: cagney/1999-11-04: Can this use of catch_exceptions either be pushed even further down or even eliminated? */ args.command = command; result = catch_exception (uiout, captured_mi_execute_command, &args, RETURN_MASK_ALL); exception_print (gdb_stderr, result); if (args.action == EXECUTE_COMMAND_SUPRESS_PROMPT) { /* The command is executing synchronously. Bail out early suppressing the finished prompt. */ mi_parse_free (command); return; } if (result.reason < 0) { /* The command execution failed and error() was called somewhere. */ fputs_unfiltered (command->token, raw_stdout); fputs_unfiltered ("^error,msg=\"", raw_stdout); if (result.message == NULL) fputs_unfiltered ("unknown error", raw_stdout); else fputstr_unfiltered (result.message, '"', raw_stdout); fputs_unfiltered ("\"\n", raw_stdout); mi_out_rewind (uiout); } mi_parse_free (command); } fputs_unfiltered ("(gdb) \n", raw_stdout); gdb_flush (raw_stdout); /* print any buffered hook code */ /* ..... */ }
static void mi_new_thread (struct thread_info *t) { struct mi_interp *mi = top_level_interpreter_data (); struct inferior *inf = find_inferior_ptid (t->ptid); gdb_assert (inf); fprintf_unfiltered (mi->event_channel, "thread-created,id=\"%d\",group-id=\"i%d\"", t->num, inf->num); gdb_flush (mi->event_channel); }
static void mi_tsv_created (const struct trace_state_variable *tsv) { struct mi_interp *mi = top_level_interpreter_data (); target_terminal_ours (); fprintf_unfiltered (mi->event_channel, "tsv-created," "name=\"%s\",initial=\"%s\"\n", tsv->name, plongest (tsv->initial_value)); gdb_flush (mi->event_channel); }
static void child_attach_to_process (char *args, int from_tty, int after_fork) { if (!args) error_no_arg ("process-id to attach"); #ifndef ATTACH_DETACH error ("Can't attach to a process on this machine."); #else { char *exec_file; int pid; char *dummy; dummy = args; pid = strtol (args, &dummy, 0); /* Some targets don't set errno on errors, grrr! */ if ((pid == 0) && (args == dummy)) error ("Illegal process-id: %s\n", args); if (pid == getpid ()) /* Trying to m********e? */ error ("I refuse to debug myself!"); if (from_tty) { exec_file = (char *) get_exec_file (0); if (after_fork) printf_unfiltered ("Attaching after fork to %s\n", target_pid_to_str (pid_to_ptid (pid))); else if (exec_file) printf_unfiltered ("Attaching to program: %s, %s\n", exec_file, target_pid_to_str (pid_to_ptid (pid))); else printf_unfiltered ("Attaching to %s\n", target_pid_to_str (pid_to_ptid (pid))); gdb_flush (gdb_stdout); } if (!after_fork) attach (pid); else REQUIRE_ATTACH (pid); inferior_ptid = pid_to_ptid (pid); push_target (&child_ops); } #endif /* ATTACH_DETACH */ }
static void inf_ptrace_attach (char *args, int from_tty) { char *exec_file; pid_t pid; char *dummy; if (!args) error_no_arg (_("process-id to attach")); dummy = args; pid = strtol (args, &dummy, 0); /* Some targets don't set errno on errors, grrr! */ if (pid == 0 && args == dummy) error (_("Illegal process-id: %s."), args); if (pid == getpid ()) /* Trying to m********e? */ error (_("I refuse to debug myself!")); if (from_tty) { exec_file = get_exec_file (0); if (exec_file) printf_unfiltered (_("Attaching to program: %s, %s\n"), exec_file, target_pid_to_str (pid_to_ptid (pid))); else printf_unfiltered (_("Attaching to %s\n"), target_pid_to_str (pid_to_ptid (pid))); gdb_flush (gdb_stdout); } #ifdef PT_ATTACH errno = 0; ptrace (PT_ATTACH, pid, (PTRACE_TYPE_ARG3)0, 0); if (errno != 0) perror_with_name (("ptrace")); attach_flag = 1; #else error (_("This system does not support attaching to a process")); #endif inferior_ptid = pid_to_ptid (pid); push_target (ptrace_ops_hack); /* Do this first, before anything has had a chance to query the inferior's symbol table or similar. */ observer_notify_inferior_created (¤t_target, from_tty); }
static void mi_tsv_deleted (const struct trace_state_variable *tsv) { struct mi_interp *mi = top_level_interpreter_data (); target_terminal_ours (); if (tsv != NULL) fprintf_unfiltered (mi->event_channel, "tsv-deleted," "name=\"%s\"\n", tsv->name); else fprintf_unfiltered (mi->event_channel, "tsv-deleted\n"); gdb_flush (mi->event_channel); }
void serial_log_command (struct target_ops *self, const char *cmd) { if (!serial_logfp) return; serial_current_type = 'c'; fputs_unfiltered ("\nc ", serial_logfp); fputs_unfiltered (cmd, serial_logfp); /* Make sure that the log file is as up-to-date as possible, in case we are getting ready to dump core or something. */ gdb_flush (serial_logfp); }
static int ioscm_fill_input (SCM port) { /* Borrowed from libguile/fports.c. */ long count; scm_t_port *pt = SCM_PTAB_ENTRY (port); /* If we're called on stdout,stderr, punt. */ if (! scm_is_eq (port, input_port_scm)) return (scm_t_wchar) EOF; /* Set errno and return -1? */ gdb_flush (gdb_stdout); gdb_flush (gdb_stderr); count = ui_file_read (gdb_stdin, (char *) pt->read_buf, pt->read_buf_size); if (count == -1) scm_syserror (FUNC_NAME); if (count == 0) return (scm_t_wchar) EOF; pt->read_pos = pt->read_buf; pt->read_end = pt->read_buf + count; return *pt->read_buf; }
static void mi_execute_command_input_handler (char *cmd) { mi_execute_command_wrapper (cmd); /* Print a prompt, indicating we're ready for further input, unless we just started a synchronous command. In that case, we're about to go back to the event loop and will output the prompt in the 'synchronous_command_done' observer when the target next stops. */ if (!sync_execution) { fputs_unfiltered ("(gdb) \n", raw_stdout); gdb_flush (raw_stdout); } }
static void mi_inferior_exit (struct inferior *inf) { struct mi_interp *mi = top_level_interpreter_data (); target_terminal_ours (); if (inf->has_exit_code) fprintf_unfiltered (mi->event_channel, "thread-group-exited,id=\"i%d\",exit-code=\"%s\"", inf->num, int_string (inf->exit_code, 8, 0, 0, 1)); else fprintf_unfiltered (mi->event_channel, "thread-group-exited,id=\"i%d\"", inf->num); gdb_flush (mi->event_channel); }
static int report_initial_inferior (struct inferior *inf, void *closure) { /* This function is called from mi_intepreter_init, and since mi_inferior_added assumes that inferior is fully initialized and top_level_interpreter_data is set, we cannot call it here. */ struct mi_interp *mi = closure; target_terminal_ours (); fprintf_unfiltered (mi->event_channel, "thread-group-added,id=\"i%d\"", inf->num); gdb_flush (mi->event_channel); return 0; }
int serial_write (struct serial *scb, const char *str, int len) { if (serial_logfp != NULL) { int count; for (count = 0; count < len; count++) serial_logchar (serial_logfp, 'w', str[count] & 0xff, 0); /* Make sure that the log file is as up-to-date as possible, in case we are getting ready to dump core or something. */ gdb_flush (serial_logfp); } return (scb->ops->write (scb, str, len)); }
static void print_any_exception (struct ui_file *file, const char *prefix, struct gdb_exception e) { if (e.reason < 0 && e.message != NULL) { target_terminal_ours (); wrap_here (""); /* Force out any buffered output. */ gdb_flush (gdb_stdout); annotate_error_begin (); /* Print the prefix. */ if (prefix != NULL && prefix[0] != '\0') fputs_filtered (prefix, file); print_exception (file, e); } }
static void mi_breakpoint_deleted (struct breakpoint *b) { struct mi_interp *mi = top_level_interpreter_data (); if (mi_suppress_notification.breakpoint) return; if (b->number <= 0) return; target_terminal_ours (); fprintf_unfiltered (mi->event_channel, "breakpoint-deleted,id=\"%d\"", b->number); gdb_flush (mi->event_channel); }
static void mi_thread_exit (struct thread_info *t, int silent) { struct mi_interp *mi; struct inferior *inf; if (silent) return; inf = find_inferior_pid (ptid_get_pid (t->ptid)); mi = top_level_interpreter_data (); target_terminal_ours (); fprintf_unfiltered (mi->event_channel, "thread-exited,id=\"%d\",group-id=\"i%d\"", t->num, inf->num); gdb_flush (mi->event_channel); }