1 /* MI Interpreter Definitions and Commands for GDB, the GNU debugger.
3 Copyright (C) 2002-2022 Free Software Foundation, Inc.
5 This file is part of GDB.
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.
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.
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/>. */
22 #include "mi-interp.h"
25 #include "event-top.h"
26 #include "gdbsupport/event-loop.h"
34 #include "mi-console.h"
35 #include "mi-common.h"
36 #include "observable.h"
37 #include "gdbthread.h"
40 #include "tracepoint.h"
42 #include "thread-fsm.h"
43 #include "cli/cli-interp.h"
44 #include "gdbsupport/scope-exit.h"
46 /* These are the interpreter setup, etc. functions for the MI
49 static void mi_execute_command_wrapper (const char *cmd
);
50 static void mi_execute_command_input_handler
51 (gdb::unique_xmalloc_ptr
<char> &&cmd
);
53 /* These are hooks that we put in place while doing interpreter_exec
54 so we can report interesting things that happened "behind the MI's
55 back" in this command. */
57 static int mi_interp_query_hook (const char *ctlstr
, va_list ap
)
58 ATTRIBUTE_PRINTF (1, 0);
60 static void mi_insert_notify_hooks (void);
61 static void mi_remove_notify_hooks (void);
63 static void mi_on_signal_received (enum gdb_signal siggnal
);
64 static void mi_on_end_stepping_range (void);
65 static void mi_on_signal_exited (enum gdb_signal siggnal
);
66 static void mi_on_exited (int exitstatus
);
67 static void mi_on_normal_stop (struct bpstat
*bs
, int print_frame
);
68 static void mi_on_no_history (void);
70 static void mi_new_thread (struct thread_info
*t
);
71 static void mi_thread_exit (struct thread_info
*t
, int silent
);
72 static void mi_record_changed (struct inferior
*, int, const char *,
74 static void mi_inferior_added (struct inferior
*inf
);
75 static void mi_inferior_appeared (struct inferior
*inf
);
76 static void mi_inferior_exit (struct inferior
*inf
);
77 static void mi_inferior_removed (struct inferior
*inf
);
78 static void mi_on_resume (ptid_t ptid
);
79 static void mi_solib_loaded (struct so_list
*solib
);
80 static void mi_solib_unloaded (struct so_list
*solib
);
81 static void mi_about_to_proceed (void);
82 static void mi_traceframe_changed (int tfnum
, int tpnum
);
83 static void mi_tsv_created (const struct trace_state_variable
*tsv
);
84 static void mi_tsv_deleted (const struct trace_state_variable
*tsv
);
85 static void mi_tsv_modified (const struct trace_state_variable
*tsv
);
86 static void mi_breakpoint_created (struct breakpoint
*b
);
87 static void mi_breakpoint_deleted (struct breakpoint
*b
);
88 static void mi_breakpoint_modified (struct breakpoint
*b
);
89 static void mi_command_param_changed (const char *param
, const char *value
);
90 static void mi_memory_changed (struct inferior
*inf
, CORE_ADDR memaddr
,
91 ssize_t len
, const bfd_byte
*myaddr
);
92 static void mi_on_sync_execution_done (void);
94 /* Display the MI prompt. */
97 display_mi_prompt (struct mi_interp
*mi
)
99 struct ui
*ui
= current_ui
;
101 gdb_puts ("(gdb) \n", mi
->raw_stdout
);
102 gdb_flush (mi
->raw_stdout
);
103 ui
->prompt_state
= PROMPTED
;
106 /* Returns the INTERP's data cast as mi_interp if INTERP is an MI, and
107 returns NULL otherwise. */
109 static struct mi_interp
*
110 as_mi_interp (struct interp
*interp
)
112 return dynamic_cast<mi_interp
*> (interp
);
115 /* Observer for the command_error notification. */
118 mi_on_command_error ()
120 mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
122 display_mi_prompt (mi
);
126 mi_interp::init (bool top_level
)
128 mi_interp
*mi
= this;
130 /* Store the current output channel, so that we can create a console
131 channel that encapsulates and prefixes all gdb_output-type bits
132 coming from the rest of the debugger. */
133 mi
->raw_stdout
= gdb_stdout
;
135 /* Create MI console channels, each with a different prefix so they
136 can be distinguished. */
137 mi
->out
= new mi_console_file (mi
->raw_stdout
, "~", '"');
138 mi
->err
= new mi_console_file (mi
->raw_stdout
, "&", '"');
140 mi
->targ
= new mi_console_file (mi
->raw_stdout
, "@", '"');
141 mi
->event_channel
= new mi_console_file (mi
->raw_stdout
, "=", 0);
142 mi
->mi_uiout
= mi_out_new (name ());
143 gdb_assert (mi
->mi_uiout
!= nullptr);
144 mi
->cli_uiout
= new cli_ui_out (mi
->out
);
148 /* The initial inferior is created before this function is called, so we
149 need to report it explicitly when initializing the top-level MI
152 This is also called when additional MI interpreters are added (using
153 the new-ui command), when multiple inferiors possibly exist, so we need
154 to use iteration to report all the inferiors. mi_inferior_added can't
155 be used, because it would print the event on all the other MI UIs. */
157 for (inferior
*inf
: all_inferiors ())
159 target_terminal::scoped_restore_terminal_state term_state
;
160 target_terminal::ours_for_output ();
162 gdb_printf (mi
->event_channel
,
163 "thread-group-added,id=\"i%d\"",
166 gdb_flush (mi
->event_channel
);
174 struct mi_interp
*mi
= this;
175 struct ui
*ui
= current_ui
;
177 /* As per hack note in mi_interpreter_init, swap in the output
179 gdb_setup_readline (0);
181 ui
->call_readline
= gdb_readline_no_editing_callback
;
182 ui
->input_handler
= mi_execute_command_input_handler
;
184 gdb_stdout
= mi
->out
;
185 /* Route error and log output through the MI. */
186 gdb_stderr
= mi
->err
;
187 gdb_stdlog
= mi
->log
;
188 /* Route target output through the MI. */
189 gdb_stdtarg
= mi
->targ
;
190 /* Route target error through the MI as well. */
191 gdb_stdtargerr
= mi
->targ
;
193 /* Replace all the hooks that we know about. There really needs to
194 be a better way of doing this... */
195 clear_interpreter_hooks ();
197 deprecated_show_load_progress
= mi_load_progress
;
201 mi_interp::suspend ()
203 gdb_disable_readline ();
207 mi_interp::exec (const char *command
)
209 mi_execute_command_wrapper (command
);
210 return gdb_exception ();
214 mi_cmd_interpreter_exec (const char *command
, char **argv
, int argc
)
216 struct interp
*interp_to_use
;
220 error (_("-interpreter-exec: "
221 "Usage: -interpreter-exec interp command"));
223 interp_to_use
= interp_lookup (current_ui
, argv
[0]);
224 if (interp_to_use
== NULL
)
225 error (_("-interpreter-exec: could not find interpreter \"%s\""),
228 /* Note that unlike the CLI version of this command, we don't
229 actually set INTERP_TO_USE as the current interpreter, as we
230 still want gdb_stdout, etc. to point at MI streams. */
232 /* Insert the MI out hooks, making sure to also call the
233 interpreter's hooks if it has any. */
234 /* KRS: We shouldn't need this... Events should be installed and
235 they should just ALWAYS fire something out down the MI
237 mi_insert_notify_hooks ();
239 /* Now run the code. */
243 mi_remove_notify_hooks ();
246 for (i
= 1; i
< argc
; i
++)
248 struct gdb_exception e
= interp_exec (interp_to_use
, argv
[i
]);
251 error ("%s", e
.what ());
255 /* This inserts a number of hooks that are meant to produce
256 async-notify ("=") MI messages while running commands in another
257 interpreter using mi_interpreter_exec. The canonical use for this
258 is to allow access to the gdb CLI interpreter from within the MI,
259 while still producing MI style output when actions in the CLI
260 command change GDB's state. */
263 mi_insert_notify_hooks (void)
265 deprecated_query_hook
= mi_interp_query_hook
;
269 mi_remove_notify_hooks (void)
271 deprecated_query_hook
= NULL
;
275 mi_interp_query_hook (const char *ctlstr
, va_list ap
)
281 mi_execute_command_wrapper (const char *cmd
)
283 struct ui
*ui
= current_ui
;
285 mi_execute_command (cmd
, ui
->instream
== ui
->stdin_stream
);
288 /* Observer for the synchronous_command_done notification. */
291 mi_on_sync_execution_done (void)
293 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
298 /* If MI is sync, then output the MI prompt now, indicating we're
299 ready for further input. */
301 display_mi_prompt (mi
);
304 /* mi_execute_command_wrapper wrapper suitable for INPUT_HANDLER. */
307 mi_execute_command_input_handler (gdb::unique_xmalloc_ptr
<char> &&cmd
)
309 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
310 struct ui
*ui
= current_ui
;
312 ui
->prompt_state
= PROMPT_NEEDED
;
314 mi_execute_command_wrapper (cmd
.get ());
316 /* Print a prompt, indicating we're ready for further input, unless
317 we just started a synchronous command. In that case, we're about
318 to go back to the event loop and will output the prompt in the
319 'synchronous_command_done' observer when the target next
321 if (ui
->prompt_state
== PROMPT_NEEDED
)
322 display_mi_prompt (mi
);
326 mi_interp::pre_command_loop ()
328 struct mi_interp
*mi
= this;
330 /* Turn off 8 bit strings in quoted output. Any character with the
331 high bit set is printed using C's octal format. */
332 sevenbit_strings
= 1;
334 /* Tell the world that we're alive. */
335 display_mi_prompt (mi
);
339 mi_new_thread (struct thread_info
*t
)
341 SWITCH_THRU_ALL_UIS ()
343 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
348 target_terminal::scoped_restore_terminal_state term_state
;
349 target_terminal::ours_for_output ();
351 gdb_printf (mi
->event_channel
,
352 "thread-created,id=\"%d\",group-id=\"i%d\"",
353 t
->global_num
, t
->inf
->num
);
354 gdb_flush (mi
->event_channel
);
359 mi_thread_exit (struct thread_info
*t
, int silent
)
361 SWITCH_THRU_ALL_UIS ()
363 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
368 target_terminal::scoped_restore_terminal_state term_state
;
369 target_terminal::ours_for_output ();
370 gdb_printf (mi
->event_channel
,
371 "thread-exited,id=\"%d\",group-id=\"i%d\"",
372 t
->global_num
, t
->inf
->num
);
373 gdb_flush (mi
->event_channel
);
377 /* Emit notification on changing the state of record. */
380 mi_record_changed (struct inferior
*inferior
, int started
, const char *method
,
383 SWITCH_THRU_ALL_UIS ()
385 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
390 target_terminal::scoped_restore_terminal_state term_state
;
391 target_terminal::ours_for_output ();
397 gdb_printf (mi
->event_channel
,
398 "record-started,thread-group=\"i%d\","
399 "method=\"%s\",format=\"%s\"",
400 inferior
->num
, method
, format
);
404 gdb_printf (mi
->event_channel
,
405 "record-started,thread-group=\"i%d\","
407 inferior
->num
, method
);
412 gdb_printf (mi
->event_channel
,
413 "record-stopped,thread-group=\"i%d\"",
417 gdb_flush (mi
->event_channel
);
422 mi_inferior_added (struct inferior
*inf
)
424 SWITCH_THRU_ALL_UIS ()
426 struct interp
*interp
;
427 struct mi_interp
*mi
;
429 /* We'll be called once for the initial inferior, before the top
430 level interpreter is set. */
431 interp
= top_level_interpreter ();
435 mi
= as_mi_interp (interp
);
439 target_terminal::scoped_restore_terminal_state term_state
;
440 target_terminal::ours_for_output ();
442 gdb_printf (mi
->event_channel
,
443 "thread-group-added,id=\"i%d\"",
445 gdb_flush (mi
->event_channel
);
450 mi_inferior_appeared (struct inferior
*inf
)
452 SWITCH_THRU_ALL_UIS ()
454 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
459 target_terminal::scoped_restore_terminal_state term_state
;
460 target_terminal::ours_for_output ();
462 gdb_printf (mi
->event_channel
,
463 "thread-group-started,id=\"i%d\",pid=\"%d\"",
465 gdb_flush (mi
->event_channel
);
470 mi_inferior_exit (struct inferior
*inf
)
472 SWITCH_THRU_ALL_UIS ()
474 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
479 target_terminal::scoped_restore_terminal_state term_state
;
480 target_terminal::ours_for_output ();
482 if (inf
->has_exit_code
)
483 gdb_printf (mi
->event_channel
,
484 "thread-group-exited,id=\"i%d\",exit-code=\"%s\"",
485 inf
->num
, int_string (inf
->exit_code
, 8, 0, 0, 1));
487 gdb_printf (mi
->event_channel
,
488 "thread-group-exited,id=\"i%d\"", inf
->num
);
490 gdb_flush (mi
->event_channel
);
495 mi_inferior_removed (struct inferior
*inf
)
497 SWITCH_THRU_ALL_UIS ()
499 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
504 target_terminal::scoped_restore_terminal_state term_state
;
505 target_terminal::ours_for_output ();
507 gdb_printf (mi
->event_channel
,
508 "thread-group-removed,id=\"i%d\"",
510 gdb_flush (mi
->event_channel
);
514 /* Return the MI interpreter, if it is active -- either because it's
515 the top-level interpreter or the interpreter executing the current
516 command. Returns NULL if the MI interpreter is not being used. */
518 static struct mi_interp
*
519 find_mi_interp (void)
521 struct mi_interp
*mi
;
523 mi
= as_mi_interp (top_level_interpreter ());
527 mi
= as_mi_interp (command_interp ());
534 /* Observers for several run control events that print why the
535 inferior has stopped to both the MI event channel and to the MI
536 console. If the MI interpreter is not active, print nothing. */
538 /* Observer for the signal_received notification. */
541 mi_on_signal_received (enum gdb_signal siggnal
)
543 SWITCH_THRU_ALL_UIS ()
545 struct mi_interp
*mi
= find_mi_interp ();
550 print_signal_received_reason (mi
->mi_uiout
, siggnal
);
551 print_signal_received_reason (mi
->cli_uiout
, siggnal
);
555 /* Observer for the end_stepping_range notification. */
558 mi_on_end_stepping_range (void)
560 SWITCH_THRU_ALL_UIS ()
562 struct mi_interp
*mi
= find_mi_interp ();
567 print_end_stepping_range_reason (mi
->mi_uiout
);
568 print_end_stepping_range_reason (mi
->cli_uiout
);
572 /* Observer for the signal_exited notification. */
575 mi_on_signal_exited (enum gdb_signal siggnal
)
577 SWITCH_THRU_ALL_UIS ()
579 struct mi_interp
*mi
= find_mi_interp ();
584 print_signal_exited_reason (mi
->mi_uiout
, siggnal
);
585 print_signal_exited_reason (mi
->cli_uiout
, siggnal
);
589 /* Observer for the exited notification. */
592 mi_on_exited (int exitstatus
)
594 SWITCH_THRU_ALL_UIS ()
596 struct mi_interp
*mi
= find_mi_interp ();
601 print_exited_reason (mi
->mi_uiout
, exitstatus
);
602 print_exited_reason (mi
->cli_uiout
, exitstatus
);
606 /* Observer for the no_history notification. */
609 mi_on_no_history (void)
611 SWITCH_THRU_ALL_UIS ()
613 struct mi_interp
*mi
= find_mi_interp ();
618 print_no_history_reason (mi
->mi_uiout
);
619 print_no_history_reason (mi
->cli_uiout
);
624 mi_on_normal_stop_1 (struct bpstat
*bs
, int print_frame
)
626 /* Since this can be called when CLI command is executing,
627 using cli interpreter, be sure to use MI uiout for output,
628 not the current one. */
629 struct ui_out
*mi_uiout
= top_level_interpreter ()->interp_ui_out ();
630 struct mi_interp
*mi
= (struct mi_interp
*) top_level_interpreter ();
634 struct thread_info
*tp
;
636 struct interp
*console_interp
;
638 tp
= inferior_thread ();
640 if (tp
->thread_fsm () != nullptr
641 && tp
->thread_fsm ()->finished_p ())
643 enum async_reply_reason reason
;
645 reason
= tp
->thread_fsm ()->async_reply_reason ();
646 mi_uiout
->field_string ("reason", async_reason_lookup (reason
));
649 console_interp
= interp_lookup (current_ui
, INTERP_CONSOLE
);
650 /* We only want to print the displays once, and we want it to
651 look just how it would on the console, so we use this to
652 decide whether the MI stop should include them. */
653 bool console_print
= should_print_stop_to_console (console_interp
, tp
);
654 print_stop_event (mi_uiout
, !console_print
);
657 print_stop_event (mi
->cli_uiout
);
659 mi_uiout
->field_signed ("thread-id", tp
->global_num
);
662 ui_out_emit_list
list_emitter (mi_uiout
, "stopped-threads");
664 mi_uiout
->field_signed (NULL
, tp
->global_num
);
667 mi_uiout
->field_string ("stopped-threads", "all");
669 core
= target_core_of_thread (tp
->ptid
);
671 mi_uiout
->field_signed ("core", core
);
674 gdb_puts ("*stopped", mi
->raw_stdout
);
675 mi_out_put (mi_uiout
, mi
->raw_stdout
);
676 mi_out_rewind (mi_uiout
);
677 mi_print_timing_maybe (mi
->raw_stdout
);
678 gdb_puts ("\n", mi
->raw_stdout
);
679 gdb_flush (mi
->raw_stdout
);
683 mi_on_normal_stop (struct bpstat
*bs
, int print_frame
)
685 SWITCH_THRU_ALL_UIS ()
687 if (as_mi_interp (top_level_interpreter ()) == NULL
)
690 mi_on_normal_stop_1 (bs
, print_frame
);
695 mi_about_to_proceed (void)
697 /* Suppress output while calling an inferior function. */
699 if (inferior_ptid
!= null_ptid
)
701 struct thread_info
*tp
= inferior_thread ();
703 if (tp
->control
.in_infcall
)
710 /* When the element is non-zero, no MI notifications will be emitted in
711 response to the corresponding observers. */
713 struct mi_suppress_notification mi_suppress_notification
=
721 /* Emit notification on changing a traceframe. */
724 mi_traceframe_changed (int tfnum
, int tpnum
)
726 if (mi_suppress_notification
.traceframe
)
729 SWITCH_THRU_ALL_UIS ()
731 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
736 target_terminal::scoped_restore_terminal_state term_state
;
737 target_terminal::ours_for_output ();
740 gdb_printf (mi
->event_channel
, "traceframe-changed,"
741 "num=\"%d\",tracepoint=\"%d\"",
744 gdb_printf (mi
->event_channel
, "traceframe-changed,end");
746 gdb_flush (mi
->event_channel
);
750 /* Emit notification on creating a trace state variable. */
753 mi_tsv_created (const struct trace_state_variable
*tsv
)
755 SWITCH_THRU_ALL_UIS ()
757 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
762 target_terminal::scoped_restore_terminal_state term_state
;
763 target_terminal::ours_for_output ();
765 gdb_printf (mi
->event_channel
, "tsv-created,"
766 "name=\"%s\",initial=\"%s\"",
767 tsv
->name
.c_str (), plongest (tsv
->initial_value
));
769 gdb_flush (mi
->event_channel
);
773 /* Emit notification on deleting a trace state variable. */
776 mi_tsv_deleted (const struct trace_state_variable
*tsv
)
778 SWITCH_THRU_ALL_UIS ()
780 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
785 target_terminal::scoped_restore_terminal_state term_state
;
786 target_terminal::ours_for_output ();
789 gdb_printf (mi
->event_channel
, "tsv-deleted,"
790 "name=\"%s\"", tsv
->name
.c_str ());
792 gdb_printf (mi
->event_channel
, "tsv-deleted");
794 gdb_flush (mi
->event_channel
);
798 /* Emit notification on modifying a trace state variable. */
801 mi_tsv_modified (const struct trace_state_variable
*tsv
)
803 SWITCH_THRU_ALL_UIS ()
805 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
806 struct ui_out
*mi_uiout
;
811 mi_uiout
= top_level_interpreter ()->interp_ui_out ();
813 target_terminal::scoped_restore_terminal_state term_state
;
814 target_terminal::ours_for_output ();
816 gdb_printf (mi
->event_channel
,
819 mi_uiout
->redirect (mi
->event_channel
);
821 mi_uiout
->field_string ("name", tsv
->name
);
822 mi_uiout
->field_string ("initial",
823 plongest (tsv
->initial_value
));
824 if (tsv
->value_known
)
825 mi_uiout
->field_string ("current", plongest (tsv
->value
));
827 mi_uiout
->redirect (NULL
);
829 gdb_flush (mi
->event_channel
);
833 /* Print breakpoint BP on MI's event channel. */
836 mi_print_breakpoint_for_event (struct mi_interp
*mi
, breakpoint
*bp
)
838 ui_out
*mi_uiout
= mi
->interp_ui_out ();
840 /* We want the output from print_breakpoint to go to
841 mi->event_channel. One approach would be to just call
842 print_breakpoint, and then use mi_out_put to send the current
843 content of mi_uiout into mi->event_channel. However, that will
844 break if anything is output to mi_uiout prior to calling the
845 breakpoint_created notifications. So, we use
847 mi_uiout
->redirect (mi
->event_channel
);
851 scoped_restore restore_uiout
852 = make_scoped_restore (¤t_uiout
, mi_uiout
);
854 print_breakpoint (bp
);
856 catch (const gdb_exception
&ex
)
858 exception_print (gdb_stderr
, ex
);
861 mi_uiout
->redirect (NULL
);
864 /* Emit notification about a created breakpoint. */
867 mi_breakpoint_created (struct breakpoint
*b
)
869 if (mi_suppress_notification
.breakpoint
)
875 SWITCH_THRU_ALL_UIS ()
877 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
882 target_terminal::scoped_restore_terminal_state term_state
;
883 target_terminal::ours_for_output ();
885 gdb_printf (mi
->event_channel
,
886 "breakpoint-created");
887 mi_print_breakpoint_for_event (mi
, b
);
889 gdb_flush (mi
->event_channel
);
893 /* Emit notification about deleted breakpoint. */
896 mi_breakpoint_deleted (struct breakpoint
*b
)
898 if (mi_suppress_notification
.breakpoint
)
904 SWITCH_THRU_ALL_UIS ()
906 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
911 target_terminal::scoped_restore_terminal_state term_state
;
912 target_terminal::ours_for_output ();
914 gdb_printf (mi
->event_channel
, "breakpoint-deleted,id=\"%d\"",
917 gdb_flush (mi
->event_channel
);
921 /* Emit notification about modified breakpoint. */
924 mi_breakpoint_modified (struct breakpoint
*b
)
926 if (mi_suppress_notification
.breakpoint
)
932 SWITCH_THRU_ALL_UIS ()
934 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
939 target_terminal::scoped_restore_terminal_state term_state
;
940 target_terminal::ours_for_output ();
941 gdb_printf (mi
->event_channel
,
942 "breakpoint-modified");
943 mi_print_breakpoint_for_event (mi
, b
);
945 gdb_flush (mi
->event_channel
);
950 mi_output_running (struct thread_info
*thread
)
952 SWITCH_THRU_ALL_UIS ()
954 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
959 gdb_printf (mi
->raw_stdout
,
960 "*running,thread-id=\"%d\"\n",
965 /* Return true if there are multiple inferiors loaded. This is used
966 for backwards compatibility -- if there's only one inferior, output
967 "all", otherwise, output each resumed thread individually. */
970 multiple_inferiors_p ()
973 for (inferior
*inf ATTRIBUTE_UNUSED
: all_non_exited_inferiors ())
984 mi_on_resume_1 (struct mi_interp
*mi
,
985 process_stratum_target
*targ
, ptid_t ptid
)
987 /* To cater for older frontends, emit ^running, but do it only once
988 per each command. We do it here, since at this point we know
989 that the target was successfully resumed, and in non-async mode,
990 we won't return back to MI interpreter code until the target
991 is done running, so delaying the output of "^running" until then
992 will make it impossible for frontend to know what's going on.
994 In future (MI3), we'll be outputting "^done" here. */
995 if (!running_result_record_printed
&& mi_proceeded
)
997 gdb_printf (mi
->raw_stdout
, "%s^running\n",
998 current_token
? current_token
: "");
1001 /* Backwards compatibility. If doing a wildcard resume and there's
1002 only one inferior, output "all", otherwise, output each resumed
1003 thread individually. */
1004 if ((ptid
== minus_one_ptid
|| ptid
.is_pid ())
1005 && !multiple_inferiors_p ())
1006 gdb_printf (mi
->raw_stdout
, "*running,thread-id=\"all\"\n");
1008 for (thread_info
*tp
: all_non_exited_threads (targ
, ptid
))
1009 mi_output_running (tp
);
1011 if (!running_result_record_printed
&& mi_proceeded
)
1013 running_result_record_printed
= 1;
1014 /* This is what gdb used to do historically -- printing prompt
1015 even if it cannot actually accept any input. This will be
1016 surely removed for MI3, and may be removed even earlier. */
1017 if (current_ui
->prompt_state
== PROMPT_BLOCKED
)
1018 gdb_puts ("(gdb) \n", mi
->raw_stdout
);
1020 gdb_flush (mi
->raw_stdout
);
1024 mi_on_resume (ptid_t ptid
)
1026 struct thread_info
*tp
= NULL
;
1028 process_stratum_target
*target
= current_inferior ()->process_target ();
1029 if (ptid
== minus_one_ptid
|| ptid
.is_pid ())
1030 tp
= inferior_thread ();
1032 tp
= find_thread_ptid (target
, ptid
);
1034 /* Suppress output while calling an inferior function. */
1035 if (tp
->control
.in_infcall
)
1038 SWITCH_THRU_ALL_UIS ()
1040 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
1045 target_terminal::scoped_restore_terminal_state term_state
;
1046 target_terminal::ours_for_output ();
1048 mi_on_resume_1 (mi
, target
, ptid
);
1052 /* See mi-interp.h. */
1055 mi_output_solib_attribs (ui_out
*uiout
, struct so_list
*solib
)
1057 struct gdbarch
*gdbarch
= target_gdbarch ();
1059 uiout
->field_string ("id", solib
->so_original_name
);
1060 uiout
->field_string ("target-name", solib
->so_original_name
);
1061 uiout
->field_string ("host-name", solib
->so_name
);
1062 uiout
->field_signed ("symbols-loaded", solib
->symbols_loaded
);
1063 if (!gdbarch_has_global_solist (target_gdbarch ()))
1064 uiout
->field_fmt ("thread-group", "i%d", current_inferior ()->num
);
1066 ui_out_emit_list
list_emitter (uiout
, "ranges");
1067 ui_out_emit_tuple
tuple_emitter (uiout
, NULL
);
1068 if (solib
->addr_high
!= 0)
1070 uiout
->field_core_addr ("from", gdbarch
, solib
->addr_low
);
1071 uiout
->field_core_addr ("to", gdbarch
, solib
->addr_high
);
1076 mi_solib_loaded (struct so_list
*solib
)
1078 SWITCH_THRU_ALL_UIS ()
1080 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
1081 struct ui_out
*uiout
;
1086 uiout
= top_level_interpreter ()->interp_ui_out ();
1088 target_terminal::scoped_restore_terminal_state term_state
;
1089 target_terminal::ours_for_output ();
1091 gdb_printf (mi
->event_channel
, "library-loaded");
1093 uiout
->redirect (mi
->event_channel
);
1095 mi_output_solib_attribs (uiout
, solib
);
1097 uiout
->redirect (NULL
);
1099 gdb_flush (mi
->event_channel
);
1104 mi_solib_unloaded (struct so_list
*solib
)
1106 SWITCH_THRU_ALL_UIS ()
1108 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
1109 struct ui_out
*uiout
;
1114 uiout
= top_level_interpreter ()->interp_ui_out ();
1116 target_terminal::scoped_restore_terminal_state term_state
;
1117 target_terminal::ours_for_output ();
1119 gdb_printf (mi
->event_channel
, "library-unloaded");
1121 uiout
->redirect (mi
->event_channel
);
1123 uiout
->field_string ("id", solib
->so_original_name
);
1124 uiout
->field_string ("target-name", solib
->so_original_name
);
1125 uiout
->field_string ("host-name", solib
->so_name
);
1126 if (!gdbarch_has_global_solist (target_gdbarch ()))
1128 uiout
->field_fmt ("thread-group", "i%d", current_inferior ()->num
);
1131 uiout
->redirect (NULL
);
1133 gdb_flush (mi
->event_channel
);
1137 /* Emit notification about the command parameter change. */
1140 mi_command_param_changed (const char *param
, const char *value
)
1142 if (mi_suppress_notification
.cmd_param_changed
)
1145 SWITCH_THRU_ALL_UIS ()
1147 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
1148 struct ui_out
*mi_uiout
;
1153 mi_uiout
= top_level_interpreter ()->interp_ui_out ();
1155 target_terminal::scoped_restore_terminal_state term_state
;
1156 target_terminal::ours_for_output ();
1158 gdb_printf (mi
->event_channel
, "cmd-param-changed");
1160 mi_uiout
->redirect (mi
->event_channel
);
1162 mi_uiout
->field_string ("param", param
);
1163 mi_uiout
->field_string ("value", value
);
1165 mi_uiout
->redirect (NULL
);
1167 gdb_flush (mi
->event_channel
);
1171 /* Emit notification about the target memory change. */
1174 mi_memory_changed (struct inferior
*inferior
, CORE_ADDR memaddr
,
1175 ssize_t len
, const bfd_byte
*myaddr
)
1177 if (mi_suppress_notification
.memory
)
1180 SWITCH_THRU_ALL_UIS ()
1182 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
1183 struct ui_out
*mi_uiout
;
1184 struct obj_section
*sec
;
1189 mi_uiout
= top_level_interpreter ()->interp_ui_out ();
1191 target_terminal::scoped_restore_terminal_state term_state
;
1192 target_terminal::ours_for_output ();
1194 gdb_printf (mi
->event_channel
, "memory-changed");
1196 mi_uiout
->redirect (mi
->event_channel
);
1198 mi_uiout
->field_fmt ("thread-group", "i%d", inferior
->num
);
1199 mi_uiout
->field_core_addr ("addr", target_gdbarch (), memaddr
);
1200 mi_uiout
->field_string ("len", hex_string (len
));
1202 /* Append 'type=code' into notification if MEMADDR falls in the range of
1203 sections contain code. */
1204 sec
= find_pc_section (memaddr
);
1205 if (sec
!= NULL
&& sec
->objfile
!= NULL
)
1207 flagword flags
= bfd_section_flags (sec
->the_bfd_section
);
1209 if (flags
& SEC_CODE
)
1210 mi_uiout
->field_string ("type", "code");
1213 mi_uiout
->redirect (NULL
);
1215 gdb_flush (mi
->event_channel
);
1219 /* Emit an event when the selection context (inferior, thread, frame)
1223 mi_user_selected_context_changed (user_selected_what selection
)
1225 struct thread_info
*tp
;
1227 /* Don't send an event if we're responding to an MI command. */
1228 if (mi_suppress_notification
.user_selected_context
)
1231 if (inferior_ptid
!= null_ptid
)
1232 tp
= inferior_thread ();
1236 SWITCH_THRU_ALL_UIS ()
1238 struct mi_interp
*mi
= as_mi_interp (top_level_interpreter ());
1239 struct ui_out
*mi_uiout
;
1244 mi_uiout
= top_level_interpreter ()->interp_ui_out ();
1246 mi_uiout
->redirect (mi
->event_channel
);
1247 ui_out_redirect_pop
redirect_popper (mi_uiout
);
1249 target_terminal::scoped_restore_terminal_state term_state
;
1250 target_terminal::ours_for_output ();
1252 if (selection
& USER_SELECTED_INFERIOR
)
1253 print_selected_inferior (mi
->cli_uiout
);
1256 && (selection
& (USER_SELECTED_THREAD
| USER_SELECTED_FRAME
)))
1258 print_selected_thread_frame (mi
->cli_uiout
, selection
);
1260 gdb_printf (mi
->event_channel
,
1261 "thread-selected,id=\"%d\"",
1264 if (tp
->state
!= THREAD_RUNNING
)
1266 if (has_stack_frames ())
1267 print_stack_frame_to_uiout (mi_uiout
, get_selected_frame (NULL
),
1272 gdb_flush (mi
->event_channel
);
1277 mi_interp::interp_ui_out ()
1279 return this->mi_uiout
;
1282 /* Do MI-specific logging actions; save raw_stdout, and change all
1283 the consoles to use the supplied ui-file(s). */
1286 mi_interp::set_logging (ui_file_up logfile
, bool logging_redirect
,
1287 bool debug_redirect
)
1289 struct mi_interp
*mi
= this;
1291 if (logfile
!= NULL
)
1293 mi
->saved_raw_stdout
= mi
->raw_stdout
;
1295 /* If something is being redirected, then grab logfile. */
1296 ui_file
*logfile_p
= nullptr;
1297 if (logging_redirect
|| debug_redirect
)
1299 logfile_p
= logfile
.get ();
1300 mi
->saved_raw_file_to_delete
= logfile_p
;
1303 /* If something is not being redirected, then a tee containing both the
1304 logfile and stdout. */
1305 ui_file
*tee
= nullptr;
1306 if (!logging_redirect
|| !debug_redirect
)
1308 tee
= new tee_file (mi
->raw_stdout
, std::move (logfile
));
1309 mi
->saved_raw_file_to_delete
= tee
;
1312 mi
->raw_stdout
= logging_redirect
? logfile_p
: tee
;
1313 mi
->raw_stdlog
= debug_redirect
? logfile_p
: tee
;
1317 delete mi
->saved_raw_file_to_delete
;
1318 mi
->raw_stdout
= mi
->saved_raw_stdout
;
1319 mi
->saved_raw_stdout
= nullptr;
1320 mi
->saved_raw_file_to_delete
= nullptr;
1323 mi
->out
->set_raw (mi
->raw_stdout
);
1324 mi
->err
->set_raw (mi
->raw_stdout
);
1325 mi
->log
->set_raw (mi
->raw_stdout
);
1326 mi
->targ
->set_raw (mi
->raw_stdout
);
1327 mi
->event_channel
->set_raw (mi
->raw_stdout
);
1330 /* Factory for MI interpreters. */
1332 static struct interp
*
1333 mi_interp_factory (const char *name
)
1335 return new mi_interp (name
);
1338 void _initialize_mi_interp ();
1340 _initialize_mi_interp ()
1342 /* The various interpreter levels. */
1343 interp_factory_register (INTERP_MI1
, mi_interp_factory
);
1344 interp_factory_register (INTERP_MI2
, mi_interp_factory
);
1345 interp_factory_register (INTERP_MI3
, mi_interp_factory
);
1346 interp_factory_register (INTERP_MI4
, mi_interp_factory
);
1347 interp_factory_register (INTERP_MI
, mi_interp_factory
);
1349 gdb::observers::signal_received
.attach (mi_on_signal_received
, "mi-interp");
1350 gdb::observers::end_stepping_range
.attach (mi_on_end_stepping_range
,
1352 gdb::observers::signal_exited
.attach (mi_on_signal_exited
, "mi-interp");
1353 gdb::observers::exited
.attach (mi_on_exited
, "mi-interp");
1354 gdb::observers::no_history
.attach (mi_on_no_history
, "mi-interp");
1355 gdb::observers::new_thread
.attach (mi_new_thread
, "mi-interp");
1356 gdb::observers::thread_exit
.attach (mi_thread_exit
, "mi-interp");
1357 gdb::observers::inferior_added
.attach (mi_inferior_added
, "mi-interp");
1358 gdb::observers::inferior_appeared
.attach (mi_inferior_appeared
, "mi-interp");
1359 gdb::observers::inferior_exit
.attach (mi_inferior_exit
, "mi-interp");
1360 gdb::observers::inferior_removed
.attach (mi_inferior_removed
, "mi-interp");
1361 gdb::observers::record_changed
.attach (mi_record_changed
, "mi-interp");
1362 gdb::observers::normal_stop
.attach (mi_on_normal_stop
, "mi-interp");
1363 gdb::observers::target_resumed
.attach (mi_on_resume
, "mi-interp");
1364 gdb::observers::solib_loaded
.attach (mi_solib_loaded
, "mi-interp");
1365 gdb::observers::solib_unloaded
.attach (mi_solib_unloaded
, "mi-interp");
1366 gdb::observers::about_to_proceed
.attach (mi_about_to_proceed
, "mi-interp");
1367 gdb::observers::traceframe_changed
.attach (mi_traceframe_changed
,
1369 gdb::observers::tsv_created
.attach (mi_tsv_created
, "mi-interp");
1370 gdb::observers::tsv_deleted
.attach (mi_tsv_deleted
, "mi-interp");
1371 gdb::observers::tsv_modified
.attach (mi_tsv_modified
, "mi-interp");
1372 gdb::observers::breakpoint_created
.attach (mi_breakpoint_created
,
1374 gdb::observers::breakpoint_deleted
.attach (mi_breakpoint_deleted
,
1376 gdb::observers::breakpoint_modified
.attach (mi_breakpoint_modified
,
1378 gdb::observers::command_param_changed
.attach (mi_command_param_changed
,
1380 gdb::observers::command_error
.attach (mi_on_command_error
, "mi-interp");
1381 gdb::observers::memory_changed
.attach (mi_memory_changed
, "mi-interp");
1382 gdb::observers::sync_execution_done
.attach (mi_on_sync_execution_done
,
1384 gdb::observers::user_selected_context_changed
.attach
1385 (mi_user_selected_context_changed
, "mi-interp");