1999-04-16 09:35:26 +08:00
|
|
|
/* Top level stuff for GDB, the GNU debugger.
|
2005-01-18 00:17:36 +08:00
|
|
|
|
2016-01-01 12:33:14 +08:00
|
|
|
Copyright (C) 1986-2016 Free Software Foundation, Inc.
|
1999-04-16 09:35:26 +08:00
|
|
|
|
1999-07-08 04:19:36 +08:00
|
|
|
This file is part of GDB.
|
1999-04-16 09:35:26 +08:00
|
|
|
|
1999-07-08 04:19:36 +08:00
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
2007-08-24 02:08:50 +08:00
|
|
|
the Free Software Foundation; either version 3 of the License, or
|
1999-07-08 04:19:36 +08:00
|
|
|
(at your option) any later version.
|
1999-04-16 09:35:26 +08:00
|
|
|
|
1999-07-08 04:19:36 +08:00
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
1999-04-16 09:35:26 +08:00
|
|
|
|
1999-07-08 04:19:36 +08:00
|
|
|
You should have received a copy of the GNU General Public License
|
2007-08-24 02:08:50 +08:00
|
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2001-10-22 03:20:30 +08:00
|
|
|
#ifndef TOP_H
|
|
|
|
#define TOP_H
|
|
|
|
|
Introduce "struct ui"
This is a step towards supporting multiple consoles/MIs, each on its
own stdio streams / terminal.
See intro comment in top.h.
(I've had trouble picking a name for this object. I've started out
with "struct console" originally. But then this is about MI as well,
and there's "interpreter-exec console", which is specifically about
the CLI...
So I changed to "struct terminal", but, then we have a terminal object
that works when the input is not a terminal as well ...
Then I sort of gave up and renamed it to "struct top_level". But it
then gets horribly confusing when we talk about the "top level
interpreter that's running on the current top level".
In the end, I realized we're already sort of calling this "ui", in
struct ui_out, struct ui_file, and a few coments here and there.)
gdb/ChangeLog:
2016-06-21 Pedro Alves <palves@redhat.com>
* event-top.c: Update readline-related comments.
(input_handler, call_readline): Delete globals.
(gdb_rl_callback_handler): Call the current UI's input_handler
method.
(change_line_handler): Adjust to set current UI's properties
instead of globals.
(current_ui_, current_ui): New globals.
(get_command_line_buffer): Rewrite to refer to the current UI.
(stdin_event_handler): Adjust to call the call_readline method of
the current UI.
(gdb_readline_no_editing_callback): Adjust to call the current UI's
input_handler method.
(gdb_setup_readline): Adjust to set current UI's properties
instead of globals.
* event-top.h (call_readline, input_handler): Delete declarations.
* mi/mi-interp.c (mi_interpreter_resume): Adjust to set current
UI's properties instead of globals.
* top.c (gdb_readline_wrapper_cleanup): Adjust to set current UI's
properties instead of globals.
(gdb_readline_wrapper): Adjust to call and set current UI's
methods instead of globals.
* top.h: Include buffer.h and event-loop.h.
(struct ui): New struct.
(current_ui): New declaration.
2016-06-21 08:11:44 +08:00
|
|
|
#include "buffer.h"
|
|
|
|
#include "event-loop.h"
|
|
|
|
|
|
|
|
/* All about a user interface instance. Each user interface has its
|
|
|
|
own I/O files/streams, readline state, its own top level
|
|
|
|
interpreter (for the main UI, this is the interpreter specified
|
|
|
|
with -i on the command line) and secondary interpreters (for
|
|
|
|
interpreter-exec ...), etc. There's always one UI associated with
|
|
|
|
stdin/stdout/stderr, but the user can create secondary UIs, for
|
|
|
|
example, to create a separate MI channel on its own stdio
|
|
|
|
streams. */
|
|
|
|
|
|
|
|
struct ui
|
|
|
|
{
|
|
|
|
/* The UI's command line buffer. This is to used to accumulate
|
|
|
|
input until we have a whole command line. */
|
|
|
|
struct buffer line_buffer;
|
|
|
|
|
|
|
|
/* The callback used by the event loop whenever an event is detected
|
|
|
|
on the UI's input file descriptor. This function incrementally
|
|
|
|
builds a buffer where it accumulates the line read up to the
|
|
|
|
point of invocation. In the special case in which the character
|
|
|
|
read is newline, the function invokes the INPUT_HANDLER callback
|
|
|
|
(see below). */
|
|
|
|
void (*call_readline) (gdb_client_data);
|
|
|
|
|
|
|
|
/* The function to invoke when a complete line of input is ready for
|
|
|
|
processing. */
|
|
|
|
void (*input_handler) (char *);
|
|
|
|
};
|
|
|
|
|
|
|
|
extern struct ui *current_ui;
|
2016-03-10 02:25:00 +08:00
|
|
|
|
1999-04-16 09:35:26 +08:00
|
|
|
/* From top.c. */
|
2011-06-13 18:55:27 +08:00
|
|
|
extern char *saved_command_line;
|
1999-04-16 09:35:26 +08:00
|
|
|
extern FILE *instream;
|
2006-03-30 06:53:33 +08:00
|
|
|
extern int in_user_command;
|
2012-01-24 01:12:30 +08:00
|
|
|
extern int confirm;
|
1999-04-16 09:35:26 +08:00
|
|
|
extern char gdb_dirbuf[1024];
|
|
|
|
extern int inhibit_gdbinit;
|
2013-07-01 19:24:17 +08:00
|
|
|
extern const char gdbinit[];
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2000-02-02 08:21:19 +08:00
|
|
|
extern void print_gdb_version (struct ui_file *);
|
2013-04-12 16:57:07 +08:00
|
|
|
extern void print_gdb_configuration (struct ui_file *);
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2000-05-28 09:12:42 +08:00
|
|
|
extern void read_command_file (FILE *);
|
|
|
|
extern void init_history (void);
|
|
|
|
extern void command_loop (void);
|
|
|
|
extern int quit_confirm (void);
|
|
|
|
extern void quit_force (char *, int);
|
|
|
|
extern void quit_command (char *, int);
|
2011-09-21 23:21:28 +08:00
|
|
|
extern void quit_cover (void);
|
2000-05-28 09:12:42 +08:00
|
|
|
extern void execute_command (char *, int);
|
1999-04-16 09:35:26 +08:00
|
|
|
|
gdb/17347 - Regression: GDB stopped on run with attached process
Doing:
gdb --pid=PID -ex run
Results in GDB getting a SIGTTIN, and thus ending stopped. That's
usually indicative of a missing target_terminal_ours call.
E.g., from the PR:
$ sleep 1h & p=$!; sleep 0.1; gdb -batch sleep $p -ex run
[1] 28263
[1] Killed sleep 1h
[2]+ Stopped gdb -batch sleep $p -ex run
The workaround is doing:
gdb -ex "attach $PID" -ex "run"
instead of
gdb [-p] $PID -ex "run"
With the former, gdb waits for the attach command to complete before
moving on to the "run" command, because the interpreter is in sync
mode at this point, within execute_command. But for the latter,
attach_command is called directly from captured_main, and thus misses
that waiting. IOW, "run" is running before the attach continuation
has run, before the program stops and attach completes. The broken
terminal settings are just one symptom of that. Any command that
queries or requires input results in the same.
The fix is to wait in catch_command_errors (which is specific to
main.c nowadays), just like we wait in execute_command.
gdb/ChangeLog:
2014-09-11 Pedro Alves <palves@redhat.com>
PR gdb/17347
* main.c: Include "infrun.h".
(catch_command_errors, catch_command_errors_const): Wait for the
foreground command to complete.
* top.c (maybe_wait_sync_command_done): New function, factored out
from ...
(maybe_wait_sync_command_done): ... here.
* top.h (maybe_wait_sync_command_done): New declaration.
gdb/testsuite/ChangeLog:
2014-09-11 Pedro Alves <palves@redhat.com>
PR gdb/17347
* lib/gdb.exp (gdb_spawn_with_cmdline_opts): New procedure.
* gdb.base/attach.exp (test_command_line_attach_run): New
procedure.
(top level): Call it.
2014-09-11 20:04:15 +08:00
|
|
|
/* If the interpreter is in sync mode (we're running a user command's
|
|
|
|
list, running command hooks or similars), and we just ran a
|
|
|
|
synchronous command that started the target, wait for that command
|
|
|
|
to end. WAS_SYNC indicates whether sync_execution was set before
|
|
|
|
the command was run. */
|
|
|
|
|
|
|
|
extern void maybe_wait_sync_command_done (int was_sync);
|
|
|
|
|
Merge async and sync code paths some more
This patch makes the execution control code use largely the same
mechanisms in both sync- and async-capable targets. This means using
continuations and use the event loop to react to target events on sync
targets as well. The trick is to immediately mark infrun's event loop
source after resume instead of calling wait_for_inferior. Then
fetch_inferior_event is adjusted to do a blocking wait on sync
targets.
Tested on x86_64 Fedora 20, native and gdbserver, with and without
"maint set target-async off".
gdb/ChangeLog:
2015-09-09 Pedro Alves <palves@redhat.com>
* breakpoint.c (bpstat_do_actions_1, until_break_command): Don't
check whether the target can async.
* inf-loop.c (inferior_event_handler): Only call target_async if
the target can async.
* infcall.c: Include top.h and interps.h.
(run_inferior_call): For the interpreter to sync mode while
running the infcall. Call wait_sync_command_done instead of
wait_for_inferior plus normal_stop.
* infcmd.c (prepare_execution_command): Don't check whether the
target can async when running in the foreground.
(step_1): Delete synchronous case handling.
(step_once): Always install a continuation, even in sync mode.
(until_next_command, finish_forward): Don't check whether the
target can async.
(attach_command_post_wait, notice_new_inferior): Always install a
continuation, even in sync mode.
* infrun.c (mark_infrun_async_event_handler): New function.
(proceed): In sync mode, mark infrun's event source instead of
waiting for events here.
(fetch_inferior_event): If the target can't async, do a blocking
wait.
(prepare_to_wait): In sync mode, mark infrun's event source.
(infrun_async_inferior_event_handler): No longer bail out if the
target can't async.
* infrun.h (mark_infrun_async_event_handler): New declaration.
* linux-nat.c (linux_nat_wait_1): Remove calls to
set_sigint_trap/clear_sigint_trap.
(linux_nat_terminal_inferior): No longer check whether the target
can async.
* mi/mi-interp.c (mi_on_sync_execution_done): Update and simplify
comment.
(mi_execute_command_input_handler): No longer check whether the
target is async. Update and simplify comment.
* target.c (default_target_wait): New function.
* target.h (struct target_ops) <to_wait>: Now defaults to
default_target_wait.
(default_target_wait): Declare.
* top.c (wait_sync_command_done): New function, factored out from
...
(maybe_wait_sync_command_done): ... this.
* top.h (wait_sync_command_done): Declare.
* target-delegates.c: Regenerate.
2015-09-10 01:23:23 +08:00
|
|
|
/* Wait for a synchronous execution command to end. */
|
|
|
|
extern void wait_sync_command_done (void);
|
|
|
|
|
2011-12-17 04:29:28 +08:00
|
|
|
extern void check_frame_language_change (void);
|
|
|
|
|
2009-09-01 04:18:46 +08:00
|
|
|
/* Prepare for execution of a command.
|
2011-05-13 12:34:25 +08:00
|
|
|
Call this before every command, CLI or MI.
|
|
|
|
Returns a cleanup to be run after the command is completed. */
|
|
|
|
extern struct cleanup *prepare_execute_command (void);
|
2009-09-01 04:18:46 +08:00
|
|
|
|
1999-04-16 09:35:26 +08:00
|
|
|
/* This function returns a pointer to the string that is used
|
2010-12-29 08:58:14 +08:00
|
|
|
by gdb for its command prompt. */
|
2011-09-06 Pedro Alves <pedro@codesourcery.com>
* event-top.h (MAXPROMPTS, struct prompts): Delete.
(set_async_annotation_level, set_async_prompt, pop_prompt)
(push_prompt, new_async_prompt): Delete declarations.
* top.h (get_prompt, set_prompt): Change prototype.
(get_prefix, set_prefix, get_suffix, set_suffix): Delete
declarations.
* top.c (command_loop):
(top_prompt): New global.
(get_prefix, set_prefix, get_suffix, ): Delete.
(get_prompt, set_prompt): Rewrite.
(show_new_async_prompt): Rename to ...
(show_prompt): ... this.
(init_main): Adjust. Don't handle --annotate=2 here.
* event-top.c (new_async_prompt): Delete.
(the_prompts): Delete.
(more_to_come): Make static.
(display_gdb_prompt): Use top_level_prompt() to compute the top
level prompt, and don't notify the before_prompt observers
directly here. Always trick readline into not trying to display
the prompt if sync_execution and displaying the primary prompt.
If displaying a local/secondary prompt, always show it, even if
sync_execution is set.
(change_annotation_level): Delete.
(top_level_prompt): New, based on change_annotation_level.
(push_prompt, pop_prompt): Delete.
(async_disable_stdin): No longer pushes prompt.
(command_line_handler): No longer pushes or pops prompt. If more
input is expected, call display_gdb_prompt with an explicit empty
prompt.
(async_stop_sig): Adjust.
(set_async_annotation_level, set_async_prompt): Delete.
* python/python.c (before_prompt_hook): Adjust.
2011-09-06 22:49:00 +08:00
|
|
|
extern char *get_prompt (void);
|
2011-07-22 17:22:50 +08:00
|
|
|
|
|
|
|
/* This function returns a pointer to the string that is used
|
2011-09-06 Pedro Alves <pedro@codesourcery.com>
* event-top.h (MAXPROMPTS, struct prompts): Delete.
(set_async_annotation_level, set_async_prompt, pop_prompt)
(push_prompt, new_async_prompt): Delete declarations.
* top.h (get_prompt, set_prompt): Change prototype.
(get_prefix, set_prefix, get_suffix, set_suffix): Delete
declarations.
* top.c (command_loop):
(top_prompt): New global.
(get_prefix, set_prefix, get_suffix, ): Delete.
(get_prompt, set_prompt): Rewrite.
(show_new_async_prompt): Rename to ...
(show_prompt): ... this.
(init_main): Adjust. Don't handle --annotate=2 here.
* event-top.c (new_async_prompt): Delete.
(the_prompts): Delete.
(more_to_come): Make static.
(display_gdb_prompt): Use top_level_prompt() to compute the top
level prompt, and don't notify the before_prompt observers
directly here. Always trick readline into not trying to display
the prompt if sync_execution and displaying the primary prompt.
If displaying a local/secondary prompt, always show it, even if
sync_execution is set.
(change_annotation_level): Delete.
(top_level_prompt): New, based on change_annotation_level.
(push_prompt, pop_prompt): Delete.
(async_disable_stdin): No longer pushes prompt.
(command_line_handler): No longer pushes or pops prompt. If more
input is expected, call display_gdb_prompt with an explicit empty
prompt.
(async_stop_sig): Adjust.
(set_async_annotation_level, set_async_prompt): Delete.
* python/python.c (before_prompt_hook): Adjust.
2011-09-06 22:49:00 +08:00
|
|
|
by gdb for its command prompt. */
|
|
|
|
extern void set_prompt (const char *s);
|
1999-04-16 09:35:26 +08:00
|
|
|
|
2015-08-22 00:28:19 +08:00
|
|
|
/* Return 1 if the current input handler is a secondary prompt, 0 otherwise. */
|
|
|
|
|
|
|
|
extern int gdb_in_secondary_prompt_p (void);
|
|
|
|
|
1999-04-16 09:35:26 +08:00
|
|
|
/* From random places. */
|
|
|
|
extern int readnow_symbol_files;
|
1999-05-26 02:09:09 +08:00
|
|
|
|
2010-12-29 08:58:14 +08:00
|
|
|
/* Perform _initialize initialization. */
|
2000-05-28 09:12:42 +08:00
|
|
|
extern void gdb_init (char *);
|
1999-06-15 02:08:47 +08:00
|
|
|
|
2010-12-29 08:58:14 +08:00
|
|
|
/* For use by event-top.c. */
|
|
|
|
/* Variables from top.c. */
|
1999-06-15 02:08:47 +08:00
|
|
|
extern int source_line_number;
|
2010-04-08 00:54:39 +08:00
|
|
|
extern const char *source_file_name;
|
1999-06-15 02:08:47 +08:00
|
|
|
extern int history_expansion_p;
|
|
|
|
extern int server_command;
|
2003-06-03 00:02:59 +08:00
|
|
|
extern char *lim_at_start;
|
2001-10-22 03:20:30 +08:00
|
|
|
|
2015-01-13 06:51:33 +08:00
|
|
|
extern void gdb_add_history (const char *);
|
|
|
|
|
2003-06-08 Andrew Cagney <cagney@redhat.com>
* acinclude.m4 (gcc_AC_CHECK_DECL, (gcc_AC_CHECK_DECL): Stolen
from GCC's acinclude.m4.
* configure.in: Check for getopt's delcaration.
* aclocal.m4, config.in, configure: Re-generate.
* main.c (error_init): Delete declaration.
* defs.h (error_init): Declare.
* rs6000-tdep.c (rs6000_fetch_pointer_argument): Make static.
(rs6000_convert_from_func_ptr_addr): Make static.
(_initialize_rs6000_tdep): Add declaration.
* cli/cli-cmds.c (dont_repeat): Delete declaration.
(show_commands, set_verbose, show_history): Delete declaration.
* top.h (set_verbose): Add declaration.
(show_history, set_history, show_commands): Add declaration.
(do_restore_instream_cleanup): Add declaration.
* objc-lang.c (specialcmp): Make static.
(print_object_command): Make static.
(find_objc_msgsend): Make static.
(find_objc_msgcall_submethod_helper): Make static.
(find_objc_msgcall_submethod): Make static.
(_initialize_objc_language): Add declaration.
(find_implementation_from_class): Make static.
(find_implementation): Make static.
* objc-exp.y (yylex): Delete lookup_struct_typedef declaration.
* objc-lang.h (lookup_struct_typedef): Add declaration.
* cli/cli-interp.c (_initialize_cli_interp): Add declaration.
* cli/cli-script.c (clear_hook_in_cleanup): Make static.
(do_restore_user_call_depth): Make static.
(do_restore_instream_cleanup): Delete declaration.
(dont_repeat): Delete declaration.
* cli/cli-decode.c (add_abbrev_cmd): Delete function.
* cli/cli-dump.c (_initialize_cli_dump): Add declaration.
* reggroups.c (_initialize_reggroup): Add declaration.
* cp-support.c (_initialize_cp_support): Add declaration.
* cp-abi.c (_initialize_cp_abi): Add declaration.
* hpacc-abi.c (_initialize_hpacc_abi): Add declaration.
* gnu-v3-abi.c (gnuv3_baseclass_offset): Make static.
(_initialize_gnu_v3_abi): Add declaration.
* gnu-v2-abi.c (gnuv2_value_rtti_type): Make static.
(_initialize_gnu_v2_abi): Add declaration.
* frame-base.c (_initialize_frame_base): Add declaration.
* doublest.c (floatformat_from_length): Make static.
* frame-unwind.c (_initialize_frame_unwind): Add declaration.
* frame.c (create_sentinel_frame): Make static.
(_initialize_frame): Add declaration.
* top.c (do_catch_errors): Make static.
(gdb_rl_operate_and_get_next_completion): Make static.
* typeprint.c: Include "typeprint.h".
* sentinel-frame.c (sentinel_frame_prev_register): Make static.
(sentinel_frame_this_id): Make static.
* p-valprint.c (_initialize_pascal_valprint): Add declaration.
* ui-out.c (make_cleanup_ui_out_begin_end): Delete function.
* dwarf2-frame.c (dwarf2_frame_cache): Make static.
* p-exp.y (push_current_type, pop_current_type): ISO C declaration.
* dwarf2expr.h (dwarf_expr_context): ISO C declaration.
* maint.c (maintenance_print_architecture): Make static.
* signals/signals.c (_initialize_signals): Add declaration.
* std-regs.c (_initialize_frame_reg): Add declaration.
* jv-exp.y (push_variable): ISO C definition.
(push_qualified_expression_name): Ditto.
* memattr.c (_initialize_mem): Add declaration.
* remote.c (remote_check_watch_resources): Make static.
(remote_stopped_by_watchpoint): Make static.
(remote_stopped_data_address): Make static.
* d10v-tdep.c (nr_dmap_regs): Make static.
(a0_regnum): Make static.
(d10v_frame_unwind_cache): Make static.
(d10v_frame_p): Make static.
* osabi.c (show_osabi): Make static.
(_initialize_gdb_osabi): Add extern declaration.
* gdbtypes.c (make_qualified_type): Make static.
(safe_parse_type): Make static.
* macrocmd.c (_initialize_macrocmd): Add extern declaration.
* macrotab.c (macro_bcache_free): Make static.
* interps.c (interp_set_quiet): Make static.
(interpreter_exec_cmd): Make static.
* stack.h (select_frame_command): New file.
* stack.c: Include "stack.h".
(select_frame_command_wrapper): Delete function.
(select_frame_command): Make global.
* infcall.c: Include "infcall.h".
* linespec.c: Include "linespec.h".
* symfile.c (sections_overlap): Make static.
* cp-support.h (cp_initialize_namespace): ISO C declaration.
* charset.c (_initialize_charset): Add missing prototype.
* regcache.c (init_legacy_regcache_descr): Make static.
(do_regcache_xfree): Make static.
(regcache_xfer_part): Make static.
(_initialize_regcache): Add missing prototype.
* breakpoint.c (parse_breakpoint_sals): Make static.
(breakpoint_sals_to_pc): Make static.
* interps.h (clear_interpreter_hooks): ISO C declaration.
* Makefile.in (stack_h): Define.
(stack.o, typeprint.o, mi-main.o): Update dependencies.
(mi-cmd-stack.o, infcall.o, linespec.o): Update dependencies.
Index: mi/ChangeLog
2003-06-08 Andrew Cagney <cagney@redhat.com>
* mi-parse.c (_initialize_mi_parse): Delete function.
* mi-main.c: Include "mi-main.h".
* mi-interp.c (_initialize_mi_interp): Add declaration.
* mi-cmd-stack.c: Include "stack.h".
(select_frame_command_wrapper): Delete extern declaration.
(mi_cmd_stack_select_frame): Replace select_frame_command_wrapper
with select_frame_command.
2003-06-09 02:27:14 +08:00
|
|
|
extern void show_commands (char *args, int from_tty);
|
|
|
|
|
|
|
|
extern void set_history (char *, int);
|
|
|
|
|
|
|
|
extern void show_history (char *, int);
|
|
|
|
|
|
|
|
extern void set_verbose (char *, int, struct cmd_list_element *);
|
|
|
|
|
|
|
|
extern void do_restore_instream_cleanup (void *stream);
|
|
|
|
|
2016-03-10 02:25:00 +08:00
|
|
|
extern char *handle_line_of_input (struct buffer *cmd_line_buffer,
|
|
|
|
char *rl, int repeat,
|
|
|
|
char *annotation_suffix);
|
|
|
|
|
2001-10-22 03:20:30 +08:00
|
|
|
#endif
|