12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450 |
- /* Top level stuff for GDB, the GNU debugger.
- Copyright (C) 1986-2022 Free Software Foundation, Inc.
- This file is part of GDB.
- 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
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
- 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.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
- #include "defs.h"
- #include "gdbcmd.h"
- #include "cli/cli-cmds.h"
- #include "cli/cli-script.h"
- #include "cli/cli-setshow.h"
- #include "cli/cli-decode.h"
- #include "symtab.h"
- #include "inferior.h"
- #include "infrun.h"
- #include <signal.h>
- #include "target.h"
- #include "target-dcache.h"
- #include "breakpoint.h"
- #include "gdbtypes.h"
- #include "expression.h"
- #include "value.h"
- #include "language.h"
- #include "terminal.h"
- #include "gdbsupport/job-control.h"
- #include "annotate.h"
- #include "completer.h"
- #include "top.h"
- #include "gdbsupport/version.h"
- #include "serial.h"
- #include "main.h"
- #include "gdbsupport/event-loop.h"
- #include "gdbthread.h"
- #include "extension.h"
- #include "interps.h"
- #include "observable.h"
- #include "maint.h"
- #include "filenames.h"
- #include "frame.h"
- #include "gdbsupport/buffer.h"
- #include "gdbsupport/gdb_select.h"
- #include "gdbsupport/scope-exit.h"
- #include "gdbarch.h"
- #include "gdbsupport/pathstuff.h"
- #include "cli/cli-style.h"
- #include "pager.h"
- /* readline include files. */
- #include "readline/readline.h"
- #include "readline/history.h"
- /* readline defines this. */
- #undef savestring
- #include <sys/types.h>
- #include "event-top.h"
- #include <sys/stat.h>
- #include <ctype.h>
- #include "ui-out.h"
- #include "cli-out.h"
- #include "tracepoint.h"
- #include "inf-loop.h"
- #if defined(TUI)
- # include "tui/tui.h"
- #endif
- #ifndef O_NOCTTY
- # define O_NOCTTY 0
- #endif
- extern void initialize_all_files (void);
- #define PROMPT(X) the_prompts.prompt_stack[the_prompts.top + X].prompt
- #define PREFIX(X) the_prompts.prompt_stack[the_prompts.top + X].prefix
- #define SUFFIX(X) the_prompts.prompt_stack[the_prompts.top + X].suffix
- /* Default command line prompt. This is overridden in some configs. */
- #ifndef DEFAULT_PROMPT
- #define DEFAULT_PROMPT "(gdb) "
- #endif
- struct ui_file **
- current_ui_gdb_stdout_ptr ()
- {
- return ¤t_ui->m_gdb_stdout;
- }
- struct ui_file **
- current_ui_gdb_stdin_ptr ()
- {
- return ¤t_ui->m_gdb_stdin;
- }
- struct ui_file **
- current_ui_gdb_stderr_ptr ()
- {
- return ¤t_ui->m_gdb_stderr;
- }
- struct ui_file **
- current_ui_gdb_stdlog_ptr ()
- {
- return ¤t_ui->m_gdb_stdlog;
- }
- struct ui_out **
- current_ui_current_uiout_ptr ()
- {
- return ¤t_ui->m_current_uiout;
- }
- int inhibit_gdbinit = 0;
- /* Flag for whether we want to confirm potentially dangerous
- operations. Default is yes. */
- bool confirm = true;
- static void
- show_confirm (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- gdb_printf (file, _("Whether to confirm potentially "
- "dangerous operations is %s.\n"),
- value);
- }
- /* The last command line executed on the console. Used for command
- repetitions when the user enters an empty line. */
- static char *saved_command_line;
- /* If not NULL, the arguments that should be passed if
- saved_command_line is repeated. */
- static const char *repeat_arguments;
- /* The previous last command line executed on the console. Used for command
- repetitions when a command wants to relaunch the previously launched
- command. We need this as when a command is running, saved_command_line
- already contains the line of the currently executing command. */
- static char *previous_saved_command_line;
- /* If not NULL, the arguments that should be passed if the
- previous_saved_command_line is repeated. */
- static const char *previous_repeat_arguments;
- /* Nonzero if the current command is modified by "server ". This
- affects things like recording into the command history, commands
- repeating on RETURN, etc. This is so a user interface (emacs, GUI,
- whatever) can issue its own commands and also send along commands
- from the user, and have the user not notice that the user interface
- is issuing commands too. */
- bool server_command;
- /* Timeout limit for response from target. */
- /* The default value has been changed many times over the years. It
- was originally 5 seconds. But that was thought to be a long time
- to sit and wait, so it was changed to 2 seconds. That was thought
- to be plenty unless the connection was going through some terminal
- server or multiplexer or other form of hairy serial connection.
- In mid-1996, remote_timeout was moved from remote.c to top.c and
- it began being used in other remote-* targets. It appears that the
- default was changed to 20 seconds at that time, perhaps because the
- Renesas E7000 ICE didn't always respond in a timely manner.
- But if 5 seconds is a long time to sit and wait for retransmissions,
- 20 seconds is far worse. This demonstrates the difficulty of using
- a single variable for all protocol timeouts.
- As remote.c is used much more than remote-e7000.c, it was changed
- back to 2 seconds in 1999. */
- int remote_timeout = 2;
- /* Sbrk location on entry to main. Used for statistics only. */
- #ifdef HAVE_USEFUL_SBRK
- char *lim_at_start;
- #endif
- /* Hooks for alternate command interfaces. */
- /* This hook is called from within gdb's many mini-event loops which
- could steal control from a real user interface's event loop. It
- returns non-zero if the user is requesting a detach, zero
- otherwise. */
- int (*deprecated_ui_loop_hook) (int);
- /* Called from print_frame_info to list the line we stopped in. */
- void (*deprecated_print_frame_info_listing_hook) (struct symtab * s,
- int line,
- int stopline,
- int noerror);
- /* Replaces most of query. */
- int (*deprecated_query_hook) (const char *, va_list);
- /* Replaces most of warning. */
- void (*deprecated_warning_hook) (const char *, va_list);
- /* These three functions support getting lines of text from the user.
- They are used in sequence. First deprecated_readline_begin_hook is
- called with a text string that might be (for example) a message for
- the user to type in a sequence of commands to be executed at a
- breakpoint. If this function calls back to a GUI, it might take
- this opportunity to pop up a text interaction window with this
- message. Next, deprecated_readline_hook is called with a prompt
- that is emitted prior to collecting the user input. It can be
- called multiple times. Finally, deprecated_readline_end_hook is
- called to notify the GUI that we are done with the interaction
- window and it can close it. */
- void (*deprecated_readline_begin_hook) (const char *, ...);
- char *(*deprecated_readline_hook) (const char *);
- void (*deprecated_readline_end_hook) (void);
- /* Called as appropriate to notify the interface that we have attached
- to or detached from an already running process. */
- void (*deprecated_attach_hook) (void);
- void (*deprecated_detach_hook) (void);
- /* Used by UI as a wrapper around command execution. May do various
- things like enabling/disabling buttons, etc... */
- void (*deprecated_call_command_hook) (struct cmd_list_element * c,
- const char *cmd, int from_tty);
- /* Called when the current thread changes. Argument is thread id. */
- void (*deprecated_context_hook) (int id);
- /* The highest UI number ever assigned. */
- static int highest_ui_num;
- /* See top.h. */
- ui::ui (FILE *instream_, FILE *outstream_, FILE *errstream_)
- : next (nullptr),
- num (++highest_ui_num),
- call_readline (nullptr),
- input_handler (nullptr),
- command_editing (0),
- interp_info (nullptr),
- async (0),
- secondary_prompt_depth (0),
- stdin_stream (instream_),
- instream (instream_),
- outstream (outstream_),
- errstream (errstream_),
- input_fd (fileno (instream)),
- input_interactive_p (ISATTY (instream)),
- prompt_state (PROMPT_NEEDED),
- m_gdb_stdout (new pager_file (new stdio_file (outstream))),
- m_gdb_stdin (new stdio_file (instream)),
- m_gdb_stderr (new stderr_file (errstream)),
- m_gdb_stdlog (m_gdb_stderr),
- m_current_uiout (nullptr)
- {
- buffer_init (&line_buffer);
- if (ui_list == NULL)
- ui_list = this;
- else
- {
- struct ui *last;
- for (last = ui_list; last->next != NULL; last = last->next)
- ;
- last->next = this;
- }
- }
- ui::~ui ()
- {
- struct ui *ui, *uiprev;
- uiprev = NULL;
- for (ui = ui_list; ui != NULL; uiprev = ui, ui = ui->next)
- if (ui == this)
- break;
- gdb_assert (ui != NULL);
- if (uiprev != NULL)
- uiprev->next = next;
- else
- ui_list = next;
- delete m_gdb_stdin;
- delete m_gdb_stdout;
- delete m_gdb_stderr;
- }
- /* Open file named NAME for read/write, making sure not to make it the
- controlling terminal. */
- static gdb_file_up
- open_terminal_stream (const char *name)
- {
- scoped_fd fd = gdb_open_cloexec (name, O_RDWR | O_NOCTTY, 0);
- if (fd.get () < 0)
- perror_with_name (_("opening terminal failed"));
- return fd.to_file ("w+");
- }
- /* Implementation of the "new-ui" command. */
- static void
- new_ui_command (const char *args, int from_tty)
- {
- int argc;
- const char *interpreter_name;
- const char *tty_name;
- dont_repeat ();
- gdb_argv argv (args);
- argc = argv.count ();
- if (argc < 2)
- error (_("Usage: new-ui INTERPRETER TTY"));
- interpreter_name = argv[0];
- tty_name = argv[1];
- {
- scoped_restore save_ui = make_scoped_restore (¤t_ui);
- /* Open specified terminal. Note: we used to open it three times,
- once for each of stdin/stdout/stderr, but that does not work
- with Windows named pipes. */
- gdb_file_up stream = open_terminal_stream (tty_name);
- std::unique_ptr<ui> ui
- (new struct ui (stream.get (), stream.get (), stream.get ()));
- ui->async = 1;
- current_ui = ui.get ();
- set_top_level_interpreter (interpreter_name);
- interp_pre_command_loop (top_level_interpreter ());
- /* Make sure the file is not closed. */
- stream.release ();
- ui.release ();
- }
- gdb_printf ("New UI allocated\n");
- }
- /* Handler for SIGHUP. */
- #ifdef SIGHUP
- /* NOTE 1999-04-29: This function will be static again, once we modify
- gdb to use the event loop as the default command loop and we merge
- event-top.c into this file, top.c. */
- /* static */ void
- quit_cover (void)
- {
- /* Stop asking user for confirmation --- we're exiting. This
- prevents asking the user dumb questions. */
- confirm = 0;
- quit_command ((char *) 0, 0);
- }
- #endif /* defined SIGHUP */
- /* Line number we are currently in, in a file which is being sourced. */
- /* NOTE 1999-04-29: This variable will be static again, once we modify
- gdb to use the event loop as the default command loop and we merge
- event-top.c into this file, top.c. */
- /* static */ int source_line_number;
- /* Name of the file we are sourcing. */
- /* NOTE 1999-04-29: This variable will be static again, once we modify
- gdb to use the event loop as the default command loop and we merge
- event-top.c into this file, top.c. */
- /* static */ std::string source_file_name;
- /* Read commands from STREAM. */
- void
- read_command_file (FILE *stream)
- {
- struct ui *ui = current_ui;
- scoped_restore save_instream
- = make_scoped_restore (&ui->instream, stream);
- /* Read commands from `instream' and execute them until end of file
- or error reading instream. */
- while (ui->instream != NULL && !feof (ui->instream))
- {
- const char *command;
- /* Get a command-line. This calls the readline package. */
- command = command_line_input (NULL, NULL);
- if (command == NULL)
- break;
- command_handler (command);
- }
- }
- #ifdef __MSDOS__
- static void
- do_chdir_cleanup (void *old_dir)
- {
- chdir ((const char *) old_dir);
- xfree (old_dir);
- }
- #endif
- scoped_value_mark
- prepare_execute_command ()
- {
- /* With multiple threads running while the one we're examining is
- stopped, the dcache can get stale without us being able to detect
- it. For the duration of the command, though, use the dcache to
- help things like backtrace. */
- if (non_stop)
- target_dcache_invalidate ();
- return scoped_value_mark ();
- }
- /* Tell the user if the language has changed (except first time) after
- executing a command. */
- void
- check_frame_language_change (void)
- {
- static int warned = 0;
- struct frame_info *frame;
- /* First make sure that a new frame has been selected, in case the
- command or the hooks changed the program state. */
- frame = deprecated_safe_get_selected_frame ();
- if (current_language != expected_language)
- {
- if (language_mode == language_mode_auto && info_verbose)
- {
- /* Print what changed. */
- language_info ();
- }
- warned = 0;
- }
- /* Warn the user if the working language does not match the language
- of the current frame. Only warn the user if we are actually
- running the program, i.e. there is a stack. */
- /* FIXME: This should be cacheing the frame and only running when
- the frame changes. */
- if (has_stack_frames ())
- {
- enum language flang;
- flang = get_frame_language (frame);
- if (!warned
- && flang != language_unknown
- && flang != current_language->la_language)
- {
- gdb_printf ("%s\n", _(lang_frame_mismatch_warn));
- warned = 1;
- }
- }
- }
- /* See top.h. */
- void
- wait_sync_command_done (void)
- {
- /* Processing events may change the current UI. */
- scoped_restore save_ui = make_scoped_restore (¤t_ui);
- struct ui *ui = current_ui;
- /* We're about to wait until the target stops after having resumed
- it so must force-commit resumptions, in case we're being called
- in some context where a scoped_disable_commit_resumed object is
- active. I.e., this function is a commit-resumed sync/flush
- point. */
- scoped_enable_commit_resumed enable ("sync wait");
- while (gdb_do_one_event () >= 0)
- if (ui->prompt_state != PROMPT_BLOCKED)
- break;
- }
- /* See top.h. */
- void
- maybe_wait_sync_command_done (int was_sync)
- {
- /* 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. */
- if (!current_ui->async
- && !was_sync
- && current_ui->prompt_state == PROMPT_BLOCKED)
- wait_sync_command_done ();
- }
- /* See command.h. */
- void
- set_repeat_arguments (const char *args)
- {
- repeat_arguments = args;
- }
- /* Execute the line P as a command, in the current user context.
- Pass FROM_TTY as second argument to the defining function. */
- void
- execute_command (const char *p, int from_tty)
- {
- struct cmd_list_element *c;
- const char *line;
- const char *cmd_start = p;
- auto cleanup_if_error = make_scope_exit (bpstat_clear_actions);
- scoped_value_mark cleanup = prepare_execute_command ();
- /* This can happen when command_line_input hits end of file. */
- if (p == NULL)
- {
- cleanup_if_error.release ();
- return;
- }
- target_log_command (p);
- while (*p == ' ' || *p == '\t')
- p++;
- if (*p)
- {
- const char *cmd = p;
- const char *arg;
- std::string default_args;
- std::string default_args_and_arg;
- int was_sync = current_ui->prompt_state == PROMPT_BLOCKED;
- line = p;
- /* If trace-commands is set then this will print this command. */
- print_command_trace ("%s", p);
- c = lookup_cmd (&cmd, cmdlist, "", &default_args, 0, 1);
- p = cmd;
- scoped_restore save_repeat_args
- = make_scoped_restore (&repeat_arguments, nullptr);
- const char *args_pointer = p;
- if (!default_args.empty ())
- {
- if (*p != '\0')
- default_args_and_arg = default_args + ' ' + p;
- else
- default_args_and_arg = default_args;
- arg = default_args_and_arg.c_str ();
- }
- else
- {
- /* Pass null arg rather than an empty one. */
- arg = *p == '\0' ? nullptr : p;
- }
- /* FIXME: cagney/2002-02-02: The c->type test is pretty dodgy
- while the is_complete_command(cfunc) test is just plain
- bogus. They should both be replaced by a test of the form
- c->strip_trailing_white_space_p. */
- /* NOTE: cagney/2002-02-02: The function.cfunc in the below
- can't be replaced with func. This is because it is the
- cfunc, and not the func, that has the value that the
- is_complete_command hack is testing for. */
- /* Clear off trailing whitespace, except for set and complete
- command. */
- std::string without_whitespace;
- if (arg
- && c->type != set_cmd
- && !is_complete_command (c))
- {
- const char *old_end = arg + strlen (arg) - 1;
- p = old_end;
- while (p >= arg && (*p == ' ' || *p == '\t'))
- p--;
- if (p != old_end)
- {
- without_whitespace = std::string (arg, p + 1);
- arg = without_whitespace.c_str ();
- }
- }
- /* If this command has been pre-hooked, run the hook first. */
- execute_cmd_pre_hook (c);
- if (c->deprecated_warn_user)
- deprecated_cmd_warning (line, cmdlist);
- /* c->user_commands would be NULL in the case of a python command. */
- if (c->theclass == class_user && c->user_commands)
- execute_user_command (c, arg);
- else if (c->theclass == class_user
- && c->is_prefix () && !c->allow_unknown)
- /* If this is a user defined prefix that does not allow unknown
- (in other words, C is a prefix command and not a command
- that can be followed by its args), report the list of
- subcommands. */
- {
- std::string prefixname = c->prefixname ();
- std::string prefixname_no_space
- = prefixname.substr (0, prefixname.length () - 1);
- gdb_printf
- ("\"%s\" must be followed by the name of a subcommand.\n",
- prefixname_no_space.c_str ());
- help_list (*c->subcommands, prefixname.c_str (), all_commands,
- gdb_stdout);
- }
- else if (c->type == set_cmd)
- do_set_command (arg, from_tty, c);
- else if (c->type == show_cmd)
- do_show_command (arg, from_tty, c);
- else if (c->is_command_class_help ())
- error (_("That is not a command, just a help topic."));
- else if (deprecated_call_command_hook)
- deprecated_call_command_hook (c, arg, from_tty);
- else
- cmd_func (c, arg, from_tty);
- maybe_wait_sync_command_done (was_sync);
- /* If this command has been post-hooked, run the hook last. */
- execute_cmd_post_hook (c);
- if (repeat_arguments != NULL && cmd_start == saved_command_line)
- {
- gdb_assert (strlen (args_pointer) >= strlen (repeat_arguments));
- strcpy (saved_command_line + (args_pointer - cmd_start),
- repeat_arguments);
- }
- }
- /* Only perform the frame-language-change check if the command
- we just finished executing did not resume the inferior's execution.
- If it did resume the inferior, we will do that check after
- the inferior stopped. */
- if (has_stack_frames () && inferior_thread ()->state != THREAD_RUNNING)
- check_frame_language_change ();
- cleanup_if_error.release ();
- }
- /* See gdbcmd.h. */
- void
- execute_fn_to_ui_file (struct ui_file *file, std::function<void(void)> fn)
- {
- /* GDB_STDOUT should be better already restored during these
- restoration callbacks. */
- set_batch_flag_and_restore_page_info save_page_info;
- scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0);
- {
- current_uiout->redirect (file);
- ui_out_redirect_pop redirect_popper (current_uiout);
- scoped_restore save_stdout
- = make_scoped_restore (&gdb_stdout, file);
- scoped_restore save_stderr
- = make_scoped_restore (&gdb_stderr, file);
- scoped_restore save_stdlog
- = make_scoped_restore (&gdb_stdlog, file);
- scoped_restore save_stdtarg
- = make_scoped_restore (&gdb_stdtarg, file);
- scoped_restore save_stdtargerr
- = make_scoped_restore (&gdb_stdtargerr, file);
- fn ();
- }
- }
- /* See gdbcmd.h. */
- void
- execute_fn_to_string (std::string &res, std::function<void(void)> fn,
- bool term_out)
- {
- string_file str_file (term_out);
- try
- {
- execute_fn_to_ui_file (&str_file, fn);
- }
- catch (...)
- {
- /* Finally. */
- res = std::move (str_file.string ());
- throw;
- }
- /* And finally. */
- res = std::move (str_file.string ());
- }
- /* See gdbcmd.h. */
- void
- execute_command_to_ui_file (struct ui_file *file,
- const char *p, int from_tty)
- {
- execute_fn_to_ui_file (file, [=]() { execute_command (p, from_tty); });
- }
- /* See gdbcmd.h. */
- void
- execute_command_to_string (std::string &res, const char *p, int from_tty,
- bool term_out)
- {
- execute_fn_to_string (res, [=]() { execute_command (p, from_tty); },
- term_out);
- }
- /* See gdbcmd.h. */
- void
- execute_command_to_string (const char *p, int from_tty,
- bool term_out)
- {
- std::string dummy;
- execute_fn_to_string (dummy, [=]() { execute_command (p, from_tty); },
- term_out);
- }
- /* When nonzero, cause dont_repeat to do nothing. This should only be
- set via prevent_dont_repeat. */
- static int suppress_dont_repeat = 0;
- /* See command.h */
- void
- dont_repeat (void)
- {
- struct ui *ui = current_ui;
- if (suppress_dont_repeat || server_command)
- return;
- /* If we aren't reading from standard input, we are saving the last
- thing read from stdin in line and don't want to delete it. Null
- lines won't repeat here in any case. */
- if (ui->instream == ui->stdin_stream)
- {
- *saved_command_line = 0;
- repeat_arguments = NULL;
- }
- }
- /* See command.h */
- const char *
- repeat_previous ()
- {
- /* Do not repeat this command, as this command is a repeating command. */
- dont_repeat ();
- /* We cannot free saved_command_line, as this line is being executed,
- so swap it with previous_saved_command_line. */
- std::swap (previous_saved_command_line, saved_command_line);
- std::swap (previous_repeat_arguments, repeat_arguments);
- const char *prev = skip_spaces (get_saved_command_line ());
- if (*prev == '\0')
- error (_("No previous command to relaunch"));
- return prev;
- }
- /* See command.h. */
- scoped_restore_tmpl<int>
- prevent_dont_repeat (void)
- {
- return make_scoped_restore (&suppress_dont_repeat, 1);
- }
- /* See command.h. */
- char *
- get_saved_command_line ()
- {
- return saved_command_line;
- }
- /* See command.h. */
- void
- save_command_line (const char *cmd)
- {
- xfree (previous_saved_command_line);
- previous_saved_command_line = saved_command_line;
- previous_repeat_arguments = repeat_arguments;
- saved_command_line = xstrdup (cmd);
- repeat_arguments = NULL;
- }
- /* Read a line from the stream "instream" without command line editing.
- It prints PROMPT once at the start.
- Action is compatible with "readline", e.g. space for the result is
- malloc'd and should be freed by the caller.
- A NULL return means end of file. */
- static char *
- gdb_readline_no_editing (const char *prompt)
- {
- struct buffer line_buffer;
- struct ui *ui = current_ui;
- /* Read from stdin if we are executing a user defined command. This
- is the right thing for prompt_for_continue, at least. */
- FILE *stream = ui->instream != NULL ? ui->instream : stdin;
- int fd = fileno (stream);
- buffer_init (&line_buffer);
- if (prompt != NULL)
- {
- /* Don't use a _filtered function here. It causes the assumed
- character position to be off, since the newline we read from
- the user is not accounted for. */
- printf_unfiltered ("%s", prompt);
- gdb_flush (gdb_stdout);
- }
- while (1)
- {
- int c;
- fd_set readfds;
- QUIT;
- /* Wait until at least one byte of data is available. Control-C
- can interrupt interruptible_select, but not fgetc. */
- FD_ZERO (&readfds);
- FD_SET (fd, &readfds);
- if (interruptible_select (fd + 1, &readfds, NULL, NULL, NULL) == -1)
- {
- if (errno == EINTR)
- {
- /* If this was ctrl-c, the QUIT above handles it. */
- continue;
- }
- perror_with_name (("select"));
- }
- c = fgetc (stream);
- if (c == EOF)
- {
- if (line_buffer.used_size > 0)
- /* The last line does not end with a newline. Return it, and
- if we are called again fgetc will still return EOF and
- we'll return NULL then. */
- break;
- xfree (buffer_finish (&line_buffer));
- return NULL;
- }
- if (c == '\n')
- {
- if (line_buffer.used_size > 0
- && line_buffer.buffer[line_buffer.used_size - 1] == '\r')
- line_buffer.used_size--;
- break;
- }
- buffer_grow_char (&line_buffer, c);
- }
- buffer_grow_char (&line_buffer, '\0');
- return buffer_finish (&line_buffer);
- }
- /* Variables which control command line editing and history
- substitution. These variables are given default values at the end
- of this file. */
- static bool command_editing_p;
- /* NOTE 1999-04-29: This variable will be static again, once we modify
- gdb to use the event loop as the default command loop and we merge
- event-top.c into this file, top.c. */
- /* static */ bool history_expansion_p;
- /* Should we write out the command history on exit? In order to write out
- the history both this flag must be true, and the history_filename
- variable must be set to something sensible. */
- static bool write_history_p;
- /* The name of the file in which GDB history will be written. If this is
- set to NULL, of the empty string then history will not be written. */
- static std::string history_filename;
- /* Implement 'show history save'. */
- static void
- show_write_history_p (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- if (!write_history_p || !history_filename.empty ())
- gdb_printf (file, _("Saving of the history record on exit is %s.\n"),
- value);
- else
- gdb_printf (file, _("Saving of the history is disabled due to "
- "the value of 'history filename'.\n"));
- }
- /* The variable associated with the "set/show history size"
- command. The value -1 means unlimited, and -2 means undefined. */
- static int history_size_setshow_var = -2;
- static void
- show_history_size (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- gdb_printf (file, _("The size of the command history is %s.\n"),
- value);
- }
- /* Variable associated with the "history remove-duplicates" option.
- The value -1 means unlimited. */
- static int history_remove_duplicates = 0;
- static void
- show_history_remove_duplicates (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- gdb_printf (file,
- _("The number of history entries to look back at for "
- "duplicates is %s.\n"),
- value);
- }
- /* Implement 'show history filename'. */
- static void
- show_history_filename (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- if (!history_filename.empty ())
- gdb_printf (file, _("The filename in which to record "
- "the command history is \"%ps\".\n"),
- styled_string (file_name_style.style (), value));
- else
- gdb_printf (file, _("There is no filename currently set for "
- "recording the command history in.\n"));
- }
- /* This is like readline(), but it has some gdb-specific behavior.
- gdb may want readline in both the synchronous and async modes during
- a single gdb invocation. At the ordinary top-level prompt we might
- be using the async readline. That means we can't use
- rl_pre_input_hook, since it doesn't work properly in async mode.
- However, for a secondary prompt (" >", such as occurs during a
- `define'), gdb wants a synchronous response.
- We used to call readline() directly, running it in synchronous
- mode. But mixing modes this way is not supported, and as of
- readline 5.x it no longer works; the arrow keys come unbound during
- the synchronous call. So we make a nested call into the event
- loop. That's what gdb_readline_wrapper is for. */
- /* A flag set as soon as gdb_readline_wrapper_line is called; we can't
- rely on gdb_readline_wrapper_result, which might still be NULL if
- the user types Control-D for EOF. */
- static int gdb_readline_wrapper_done;
- /* The result of the current call to gdb_readline_wrapper, once a newline
- is seen. */
- static char *gdb_readline_wrapper_result;
- /* Any intercepted hook. Operate-and-get-next sets this, expecting it
- to be called after the newline is processed (which will redisplay
- the prompt). But in gdb_readline_wrapper we will not get a new
- prompt until the next call, or until we return to the event loop.
- So we disable this hook around the newline and restore it before we
- return. */
- static void (*saved_after_char_processing_hook) (void);
- /* See top.h. */
- int
- gdb_in_secondary_prompt_p (struct ui *ui)
- {
- return ui->secondary_prompt_depth > 0;
- }
- /* This function is called when readline has seen a complete line of
- text. */
- static void
- gdb_readline_wrapper_line (gdb::unique_xmalloc_ptr<char> &&line)
- {
- gdb_assert (!gdb_readline_wrapper_done);
- gdb_readline_wrapper_result = line.release ();
- gdb_readline_wrapper_done = 1;
- /* Prevent operate-and-get-next from acting too early. */
- saved_after_char_processing_hook = after_char_processing_hook;
- after_char_processing_hook = NULL;
- /* Prevent parts of the prompt from being redisplayed if annotations
- are enabled, and readline's state getting out of sync. We'll
- reinstall the callback handler, which puts the terminal in raw
- mode (or in readline lingo, in prepped state), when we're next
- ready to process user input, either in display_gdb_prompt, or if
- we're handling an asynchronous target event and running in the
- background, just before returning to the event loop to process
- further input (or more target events). */
- if (current_ui->command_editing)
- gdb_rl_callback_handler_remove ();
- }
- class gdb_readline_wrapper_cleanup
- {
- public:
- gdb_readline_wrapper_cleanup ()
- : m_handler_orig (current_ui->input_handler),
- m_already_prompted_orig (current_ui->command_editing
- ? rl_already_prompted : 0),
- m_target_is_async_orig (target_is_async_p ()),
- m_save_ui (¤t_ui)
- {
- current_ui->input_handler = gdb_readline_wrapper_line;
- current_ui->secondary_prompt_depth++;
- if (m_target_is_async_orig)
- target_async (0);
- }
- ~gdb_readline_wrapper_cleanup ()
- {
- struct ui *ui = current_ui;
- if (ui->command_editing)
- rl_already_prompted = m_already_prompted_orig;
- gdb_assert (ui->input_handler == gdb_readline_wrapper_line);
- ui->input_handler = m_handler_orig;
- /* Don't restore our input handler in readline yet. That would make
- readline prep the terminal (putting it in raw mode), while the
- line we just read may trigger execution of a command that expects
- the terminal in the default cooked/canonical mode, such as e.g.,
- running Python's interactive online help utility. See
- gdb_readline_wrapper_line for when we'll reinstall it. */
- gdb_readline_wrapper_result = NULL;
- gdb_readline_wrapper_done = 0;
- ui->secondary_prompt_depth--;
- gdb_assert (ui->secondary_prompt_depth >= 0);
- after_char_processing_hook = saved_after_char_processing_hook;
- saved_after_char_processing_hook = NULL;
- if (m_target_is_async_orig)
- target_async (1);
- }
- DISABLE_COPY_AND_ASSIGN (gdb_readline_wrapper_cleanup);
- private:
- void (*m_handler_orig) (gdb::unique_xmalloc_ptr<char> &&);
- int m_already_prompted_orig;
- /* Whether the target was async. */
- int m_target_is_async_orig;
- /* Processing events may change the current UI. */
- scoped_restore_tmpl<struct ui *> m_save_ui;
- };
- char *
- gdb_readline_wrapper (const char *prompt)
- {
- struct ui *ui = current_ui;
- gdb_readline_wrapper_cleanup cleanup;
- /* Display our prompt and prevent double prompt display. Don't pass
- down a NULL prompt, since that has special meaning for
- display_gdb_prompt -- it indicates a request to print the primary
- prompt, while we want a secondary prompt here. */
- display_gdb_prompt (prompt != NULL ? prompt : "");
- if (ui->command_editing)
- rl_already_prompted = 1;
- if (after_char_processing_hook)
- (*after_char_processing_hook) ();
- gdb_assert (after_char_processing_hook == NULL);
- while (gdb_do_one_event () >= 0)
- if (gdb_readline_wrapper_done)
- break;
- return gdb_readline_wrapper_result;
- }
- /* The current saved history number from operate-and-get-next.
- This is -1 if not valid. */
- static int operate_saved_history = -1;
- /* This is put on the appropriate hook and helps operate-and-get-next
- do its work. */
- static void
- gdb_rl_operate_and_get_next_completion (void)
- {
- int delta = where_history () - operate_saved_history;
- /* The `key' argument to rl_get_previous_history is ignored. */
- rl_get_previous_history (delta, 0);
- operate_saved_history = -1;
- /* readline doesn't automatically update the display for us. */
- rl_redisplay ();
- after_char_processing_hook = NULL;
- rl_pre_input_hook = NULL;
- }
- /* This is a gdb-local readline command handler. It accepts the
- current command line (like RET does) and, if this command was taken
- from the history, arranges for the next command in the history to
- appear on the command line when the prompt returns.
- We ignore the arguments. */
- static int
- gdb_rl_operate_and_get_next (int count, int key)
- {
- int where;
- /* Use the async hook. */
- after_char_processing_hook = gdb_rl_operate_and_get_next_completion;
- /* Find the current line, and find the next line to use. */
- where = where_history();
- if ((history_is_stifled () && (history_length >= history_max_entries))
- || (where >= history_length - 1))
- operate_saved_history = where;
- else
- operate_saved_history = where + 1;
- return rl_newline (1, key);
- }
- /* Number of user commands executed during this session. */
- static int command_count = 0;
- /* Add the user command COMMAND to the input history list. */
- void
- gdb_add_history (const char *command)
- {
- command_count++;
- if (history_remove_duplicates != 0)
- {
- int lookbehind;
- int lookbehind_threshold;
- /* The lookbehind threshold for finding a duplicate history entry is
- bounded by command_count because we can't meaningfully delete
- history entries that are already stored in the history file since
- the history file is appended to. */
- if (history_remove_duplicates == -1
- || history_remove_duplicates > command_count)
- lookbehind_threshold = command_count;
- else
- lookbehind_threshold = history_remove_duplicates;
- using_history ();
- for (lookbehind = 0; lookbehind < lookbehind_threshold; lookbehind++)
- {
- HIST_ENTRY *temp = previous_history ();
- if (temp == NULL)
- break;
- if (strcmp (temp->line, command) == 0)
- {
- HIST_ENTRY *prev = remove_history (where_history ());
- command_count--;
- free_history_entry (prev);
- break;
- }
- }
- using_history ();
- }
- add_history (command);
- }
- /* Safely append new history entries to the history file in a corruption-free
- way using an intermediate local history file. */
- static void
- gdb_safe_append_history (void)
- {
- int ret, saved_errno;
- std::string local_history_filename
- = string_printf ("%s-gdb%ld~", history_filename.c_str (), (long) getpid ());
- ret = rename (history_filename.c_str (), local_history_filename.c_str ());
- saved_errno = errno;
- if (ret < 0 && saved_errno != ENOENT)
- {
- warning (_("Could not rename %ps to %ps: %s"),
- styled_string (file_name_style.style (),
- history_filename.c_str ()),
- styled_string (file_name_style.style (),
- local_history_filename.c_str ()),
- safe_strerror (saved_errno));
- }
- else
- {
- if (ret < 0)
- {
- /* If the rename failed with ENOENT then either the global history
- file never existed in the first place or another GDB process is
- currently appending to it (and has thus temporarily renamed it).
- Since we can't distinguish between these two cases, we have to
- conservatively assume the first case and therefore must write out
- (not append) our known history to our local history file and try
- to move it back anyway. Otherwise a global history file would
- never get created! */
- gdb_assert (saved_errno == ENOENT);
- write_history (local_history_filename.c_str ());
- }
- else
- {
- append_history (command_count, local_history_filename.c_str ());
- if (history_is_stifled ())
- history_truncate_file (local_history_filename.c_str (),
- history_max_entries);
- }
- ret = rename (local_history_filename.c_str (), history_filename.c_str ());
- saved_errno = errno;
- if (ret < 0 && saved_errno != EEXIST)
- warning (_("Could not rename %s to %s: %s"),
- local_history_filename.c_str (), history_filename.c_str (),
- safe_strerror (saved_errno));
- }
- }
- /* Read one line from the command input stream `instream' into a local
- static buffer. The buffer is made bigger as necessary. Returns
- the address of the start of the line.
- NULL is returned for end of file.
- This routine either uses fancy command line editing or simple input
- as the user has requested. */
- const char *
- command_line_input (const char *prompt_arg, const char *annotation_suffix)
- {
- static struct buffer cmd_line_buffer;
- static int cmd_line_buffer_initialized;
- struct ui *ui = current_ui;
- const char *prompt = prompt_arg;
- char *cmd;
- int from_tty = ui->instream == ui->stdin_stream;
- /* The annotation suffix must be non-NULL. */
- if (annotation_suffix == NULL)
- annotation_suffix = "";
- if (from_tty && annotation_level > 1)
- {
- char *local_prompt;
- local_prompt
- = (char *) alloca ((prompt == NULL ? 0 : strlen (prompt))
- + strlen (annotation_suffix) + 40);
- if (prompt == NULL)
- local_prompt[0] = '\0';
- else
- strcpy (local_prompt, prompt);
- strcat (local_prompt, "\n\032\032");
- strcat (local_prompt, annotation_suffix);
- strcat (local_prompt, "\n");
- prompt = local_prompt;
- }
- if (!cmd_line_buffer_initialized)
- {
- buffer_init (&cmd_line_buffer);
- cmd_line_buffer_initialized = 1;
- }
- /* Starting a new command line. */
- cmd_line_buffer.used_size = 0;
- #ifdef SIGTSTP
- if (job_control)
- signal (SIGTSTP, handle_sigtstp);
- #endif
- while (1)
- {
- gdb::unique_xmalloc_ptr<char> rl;
- /* Make sure that all output has been output. Some machines may
- let you get away with leaving out some of the gdb_flush, but
- not all. */
- gdb_flush (gdb_stdout);
- gdb_flush (gdb_stderr);
- if (!source_file_name.empty ())
- ++source_line_number;
- if (from_tty && annotation_level > 1)
- printf_unfiltered ("\n\032\032pre-%s\n", annotation_suffix);
- /* Don't use fancy stuff if not talking to stdin. */
- if (deprecated_readline_hook
- && from_tty
- && input_interactive_p (current_ui))
- {
- rl.reset ((*deprecated_readline_hook) (prompt));
- }
- else if (command_editing_p
- && from_tty
- && input_interactive_p (current_ui))
- {
- rl.reset (gdb_readline_wrapper (prompt));
- }
- else
- {
- rl.reset (gdb_readline_no_editing (prompt));
- }
- cmd = handle_line_of_input (&cmd_line_buffer, rl.get (),
- 0, annotation_suffix);
- if (cmd == (char *) EOF)
- {
- cmd = NULL;
- break;
- }
- if (cmd != NULL)
- break;
- /* Got partial input. I.e., got a line that ends with a
- continuation character (backslash). Suppress printing the
- prompt again. */
- prompt = NULL;
- }
- #ifdef SIGTSTP
- if (job_control)
- signal (SIGTSTP, SIG_DFL);
- #endif
- return cmd;
- }
- /* See top.h. */
- void
- print_gdb_version (struct ui_file *stream, bool interactive)
- {
- /* From GNU coding standards, first line is meant to be easy for a
- program to parse, and is just canonical program name and version
- number, which starts after last space. */
- std::string v_str = string_printf ("GNU gdb %s%s", PKGVERSION, version);
- gdb_printf (stream, "%ps\n",
- styled_string (version_style.style (), v_str.c_str ()));
- /* Second line is a copyright notice. */
- gdb_printf (stream,
- "Copyright (C) 2022 Free Software Foundation, Inc.\n");
- /* Following the copyright is a brief statement that the program is
- free software, that users are free to copy and change it on
- certain conditions, that it is covered by the GNU GPL, and that
- there is no warranty. */
- gdb_printf (stream, "\
- License GPLv3+: GNU GPL version 3 or later <%ps>\
- \nThis is free software: you are free to change and redistribute it.\n\
- There is NO WARRANTY, to the extent permitted by law.",
- styled_string (file_name_style.style (),
- "http://gnu.org/licenses/gpl.html"));
- if (!interactive)
- return;
- gdb_printf (stream, ("\nType \"show copying\" and "
- "\"show warranty\" for details.\n"));
- /* After the required info we print the configuration information. */
- gdb_printf (stream, "This GDB was configured as \"");
- if (strcmp (host_name, target_name) != 0)
- {
- gdb_printf (stream, "--host=%s --target=%s",
- host_name, target_name);
- }
- else
- {
- gdb_printf (stream, "%s", host_name);
- }
- gdb_printf (stream, "\".\n");
- gdb_printf (stream, _("Type \"show configuration\" "
- "for configuration details.\n"));
- if (REPORT_BUGS_TO[0])
- {
- gdb_printf (stream,
- _("For bug reporting instructions, please see:\n"));
- gdb_printf (stream, "%ps.\n",
- styled_string (file_name_style.style (),
- REPORT_BUGS_TO));
- }
- gdb_printf (stream,
- _("Find the GDB manual and other documentation \
- resources online at:\n <%ps>."),
- styled_string (file_name_style.style (),
- "http://www.gnu.org/software/gdb/documentation/"));
- gdb_printf (stream, "\n\n");
- gdb_printf (stream, _("For help, type \"help\".\n"));
- gdb_printf (stream,
- _("Type \"apropos word\" to search for commands \
- related to \"word\"."));
- }
- /* Print the details of GDB build-time configuration. */
- void
- print_gdb_configuration (struct ui_file *stream)
- {
- gdb_printf (stream, _("\
- This GDB was configured as follows:\n\
- configure --host=%s --target=%s\n\
- "), host_name, target_name);
- gdb_printf (stream, _("\
- --with-auto-load-dir=%s\n\
- --with-auto-load-safe-path=%s\n\
- "), AUTO_LOAD_DIR, AUTO_LOAD_SAFE_PATH);
- #if HAVE_LIBEXPAT
- gdb_printf (stream, _("\
- --with-expat\n\
- "));
- #else
- gdb_printf (stream, _("\
- --without-expat\n\
- "));
- #endif
- if (GDB_DATADIR[0])
- gdb_printf (stream, _("\
- --with-gdb-datadir=%s%s\n\
- "), GDB_DATADIR, GDB_DATADIR_RELOCATABLE ? " (relocatable)" : "");
- #ifdef ICONV_BIN
- gdb_printf (stream, _("\
- --with-iconv-bin=%s%s\n\
- "), ICONV_BIN, ICONV_BIN_RELOCATABLE ? " (relocatable)" : "");
- #endif
- if (JIT_READER_DIR[0])
- gdb_printf (stream, _("\
- --with-jit-reader-dir=%s%s\n\
- "), JIT_READER_DIR, JIT_READER_DIR_RELOCATABLE ? " (relocatable)" : "");
- #if HAVE_LIBUNWIND_IA64_H
- gdb_printf (stream, _("\
- --with-libunwind-ia64\n\
- "));
- #else
- gdb_printf (stream, _("\
- --without-libunwind-ia64\n\
- "));
- #endif
- #if HAVE_LIBLZMA
- gdb_printf (stream, _("\
- --with-lzma\n\
- "));
- #else
- gdb_printf (stream, _("\
- --without-lzma\n\
- "));
- #endif
- #if HAVE_LIBBABELTRACE
- gdb_printf (stream, _("\
- --with-babeltrace\n\
- "));
- #else
- gdb_printf (stream, _("\
- --without-babeltrace\n\
- "));
- #endif
- #if HAVE_LIBIPT
- gdb_printf (stream, _("\
- --with-intel-pt\n\
- "));
- #else
- gdb_printf (stream, _("\
- --without-intel-pt\n\
- "));
- #endif
- #if HAVE_LIBMPFR
- gdb_printf (stream, _("\
- --with-mpfr\n\
- "));
- #else
- gdb_printf (stream, _("\
- --without-mpfr\n\
- "));
- #endif
- #if HAVE_LIBXXHASH
- gdb_printf (stream, _("\
- --with-xxhash\n\
- "));
- #else
- gdb_printf (stream, _("\
- --without-xxhash\n\
- "));
- #endif
- #ifdef WITH_PYTHON_PATH
- gdb_printf (stream, _("\
- --with-python=%s%s\n\
- "), WITH_PYTHON_PATH, PYTHON_PATH_RELOCATABLE ? " (relocatable)" : "");
- #else
- gdb_printf (stream, _("\
- --without-python\n\
- "));
- #endif
- #ifdef WITH_PYTHON_LIBDIR
- gdb_printf (stream, _("\
- --with-python-libdir=%s%s\n\
- "), WITH_PYTHON_LIBDIR, PYTHON_LIBDIR_RELOCATABLE ? " (relocatable)" : "");
- #else
- gdb_printf (stream, _("\
- --without-python-libdir\n\
- "));
- #endif
- #if HAVE_LIBDEBUGINFOD
- gdb_printf (stream, _("\
- --with-debuginfod\n\
- "));
- #else
- gdb_printf (stream, _("\
- --without-debuginfod\n\
- "));
- #endif
- #if HAVE_GUILE
- gdb_printf (stream, _("\
- --with-guile\n\
- "));
- #else
- gdb_printf (stream, _("\
- --without-guile\n\
- "));
- #endif
- #if HAVE_SOURCE_HIGHLIGHT
- gdb_printf (stream, _("\
- --enable-source-highlight\n\
- "));
- #else
- gdb_printf (stream, _("\
- --disable-source-highlight\n\
- "));
- #endif
- #if CXX_STD_THREAD
- gdb_printf (stream, _("\
- --enable-threading\n\
- "));
- #else
- gdb_printf (stream, _("\
- --disable-threading\n\
- "));
- #endif
- #ifdef RELOC_SRCDIR
- gdb_printf (stream, _("\
- --with-relocated-sources=%s\n\
- "), RELOC_SRCDIR);
- #endif
- if (DEBUGDIR[0])
- gdb_printf (stream, _("\
- --with-separate-debug-dir=%s%s\n\
- "), DEBUGDIR, DEBUGDIR_RELOCATABLE ? " (relocatable)" : "");
- if (TARGET_SYSTEM_ROOT[0])
- gdb_printf (stream, _("\
- --with-sysroot=%s%s\n\
- "), TARGET_SYSTEM_ROOT, TARGET_SYSTEM_ROOT_RELOCATABLE ? " (relocatable)" : "");
- if (SYSTEM_GDBINIT[0])
- gdb_printf (stream, _("\
- --with-system-gdbinit=%s%s\n\
- "), SYSTEM_GDBINIT, SYSTEM_GDBINIT_RELOCATABLE ? " (relocatable)" : "");
- if (SYSTEM_GDBINIT_DIR[0])
- gdb_printf (stream, _("\
- --with-system-gdbinit-dir=%s%s\n\
- "), SYSTEM_GDBINIT_DIR, SYSTEM_GDBINIT_DIR_RELOCATABLE ? " (relocatable)" : "");
- /* We assume "relocatable" will be printed at least once, thus we always
- print this text. It's a reasonably safe assumption for now. */
- gdb_printf (stream, _("\n\
- (\"Relocatable\" means the directory can be moved with the GDB installation\n\
- tree, and GDB will still find it.)\n\
- "));
- }
- /* The current top level prompt, settable with "set prompt", and/or
- with the python `gdb.prompt_hook' hook. */
- static std::string top_prompt;
- /* Access method for the GDB prompt string. */
- const std::string &
- get_prompt ()
- {
- return top_prompt;
- }
- /* Set method for the GDB prompt string. */
- void
- set_prompt (const char *s)
- {
- top_prompt = s;
- }
- /* Kills or detaches the given inferior, depending on how we originally
- gained control of it. */
- static void
- kill_or_detach (inferior *inf, int from_tty)
- {
- if (inf->pid == 0)
- return;
- thread_info *thread = any_thread_of_inferior (inf);
- if (thread != NULL)
- {
- switch_to_thread (thread);
- /* Leave core files alone. */
- if (target_has_execution ())
- {
- if (inf->attach_flag)
- target_detach (inf, from_tty);
- else
- target_kill ();
- }
- }
- }
- /* Prints info about what GDB will do to inferior INF on a "quit". OUT is
- where to collect the output. */
- static void
- print_inferior_quit_action (inferior *inf, ui_file *out)
- {
- if (inf->pid == 0)
- return;
- if (inf->attach_flag)
- gdb_printf (out,
- _("\tInferior %d [%s] will be detached.\n"), inf->num,
- target_pid_to_str (ptid_t (inf->pid)).c_str ());
- else
- gdb_printf (out,
- _("\tInferior %d [%s] will be killed.\n"), inf->num,
- target_pid_to_str (ptid_t (inf->pid)).c_str ());
- }
- /* If necessary, make the user confirm that we should quit. Return
- non-zero if we should quit, zero if we shouldn't. */
- int
- quit_confirm (void)
- {
- /* Don't even ask if we're only debugging a core file inferior. */
- if (!have_live_inferiors ())
- return 1;
- /* Build the query string as a single string. */
- string_file stb;
- stb.puts (_("A debugging session is active.\n\n"));
- for (inferior *inf : all_inferiors ())
- print_inferior_quit_action (inf, &stb);
- stb.puts (_("\nQuit anyway? "));
- return query ("%s", stb.c_str ());
- }
- /* Prepare to exit GDB cleanly by undoing any changes made to the
- terminal so that we leave the terminal in the state we acquired it. */
- static void
- undo_terminal_modifications_before_exit (void)
- {
- struct ui *saved_top_level = current_ui;
- target_terminal::ours ();
- current_ui = main_ui;
- #if defined(TUI)
- tui_disable ();
- #endif
- gdb_disable_readline ();
- current_ui = saved_top_level;
- }
- /* Quit without asking for confirmation. */
- void
- quit_force (int *exit_arg, int from_tty)
- {
- int exit_code = 0;
- /* An optional expression may be used to cause gdb to terminate with the
- value of that expression. */
- if (exit_arg)
- exit_code = *exit_arg;
- else if (return_child_result)
- exit_code = return_child_result_value;
- gdb::observers::gdb_exiting.notify (exit_code);
- undo_terminal_modifications_before_exit ();
- /* We want to handle any quit errors and exit regardless. */
- /* Get out of tfind mode, and kill or detach all inferiors. */
- try
- {
- disconnect_tracing ();
- for (inferior *inf : all_inferiors ())
- kill_or_detach (inf, from_tty);
- }
- catch (const gdb_exception &ex)
- {
- exception_print (gdb_stderr, ex);
- }
- /* Give all pushed targets a chance to do minimal cleanup, and pop
- them all out. */
- for (inferior *inf : all_inferiors ())
- {
- switch_to_inferior_no_thread (inf);
- try
- {
- pop_all_targets ();
- }
- catch (const gdb_exception &ex)
- {
- exception_print (gdb_stderr, ex);
- }
- }
- /* Save the history information if it is appropriate to do so. */
- try
- {
- if (write_history_p && !history_filename.empty ())
- {
- int save = 0;
- /* History is currently shared between all UIs. If there's
- any UI with a terminal, save history. */
- for (ui *ui : all_uis ())
- {
- if (input_interactive_p (ui))
- {
- save = 1;
- break;
- }
- }
- if (save)
- gdb_safe_append_history ();
- }
- }
- catch (const gdb_exception &ex)
- {
- exception_print (gdb_stderr, ex);
- }
- /* Destroy any values currently allocated now instead of leaving it
- to global destructors, because that may be too late. For
- example, the destructors of xmethod values call into the Python
- runtime, which is finalized via a final cleanup. */
- finalize_values ();
- /* Do any final cleanups before exiting. */
- try
- {
- do_final_cleanups ();
- }
- catch (const gdb_exception &ex)
- {
- exception_print (gdb_stderr, ex);
- }
- exit (exit_code);
- }
- /* The value of the "interactive-mode" setting. */
- static enum auto_boolean interactive_mode = AUTO_BOOLEAN_AUTO;
- /* Implement the "show interactive-mode" option. */
- static void
- show_interactive_mode (struct ui_file *file, int from_tty,
- struct cmd_list_element *c,
- const char *value)
- {
- if (interactive_mode == AUTO_BOOLEAN_AUTO)
- gdb_printf (file, "Debugger's interactive mode "
- "is %s (currently %s).\n",
- value, input_interactive_p (current_ui) ? "on" : "off");
- else
- gdb_printf (file, "Debugger's interactive mode is %s.\n", value);
- }
- /* Returns whether GDB is running on an interactive terminal. */
- int
- input_interactive_p (struct ui *ui)
- {
- if (batch_flag)
- return 0;
- if (interactive_mode != AUTO_BOOLEAN_AUTO)
- return interactive_mode == AUTO_BOOLEAN_TRUE;
- return ui->input_interactive_p;
- }
- static void
- dont_repeat_command (const char *ignored, int from_tty)
- {
- /* Can't call dont_repeat here because we're not necessarily reading
- from stdin. */
- *saved_command_line = 0;
- }
- /* Functions to manipulate command line editing control variables. */
- /* Number of commands to print in each call to show_commands. */
- #define Hist_print 10
- void
- show_commands (const char *args, int from_tty)
- {
- /* Index for history commands. Relative to history_base. */
- int offset;
- /* Number of the history entry which we are planning to display next.
- Relative to history_base. */
- static int num = 0;
- /* Print out some of the commands from the command history. */
- if (args)
- {
- if (args[0] == '+' && args[1] == '\0')
- /* "info editing +" should print from the stored position. */
- ;
- else
- /* "info editing <exp>" should print around command number <exp>. */
- num = (parse_and_eval_long (args) - history_base) - Hist_print / 2;
- }
- /* "show commands" means print the last Hist_print commands. */
- else
- {
- num = history_length - Hist_print;
- }
- if (num < 0)
- num = 0;
- /* If there are at least Hist_print commands, we want to display the last
- Hist_print rather than, say, the last 6. */
- if (history_length - num < Hist_print)
- {
- num = history_length - Hist_print;
- if (num < 0)
- num = 0;
- }
- for (offset = num;
- offset < num + Hist_print && offset < history_length;
- offset++)
- {
- gdb_printf ("%5d %s\n", history_base + offset,
- (history_get (history_base + offset))->line);
- }
- /* The next command we want to display is the next one that we haven't
- displayed yet. */
- num += Hist_print;
- /* If the user repeats this command with return, it should do what
- "show commands +" does. This is unnecessary if arg is null,
- because "show commands +" is not useful after "show commands". */
- if (from_tty && args)
- set_repeat_arguments ("+");
- }
- /* Update the size of our command history file to HISTORY_SIZE.
- A HISTORY_SIZE of -1 stands for unlimited. */
- static void
- set_readline_history_size (int history_size)
- {
- gdb_assert (history_size >= -1);
- if (history_size == -1)
- unstifle_history ();
- else
- stifle_history (history_size);
- }
- /* Called by do_setshow_command. */
- static void
- set_history_size_command (const char *args,
- int from_tty, struct cmd_list_element *c)
- {
- set_readline_history_size (history_size_setshow_var);
- }
- bool info_verbose = false; /* Default verbose msgs off. */
- /* Called by do_set_command. An elaborate joke. */
- void
- set_verbose (const char *args, int from_tty, struct cmd_list_element *c)
- {
- const char *cmdname = "verbose";
- struct cmd_list_element *showcmd;
- showcmd = lookup_cmd_1 (&cmdname, showlist, NULL, NULL, 1);
- gdb_assert (showcmd != NULL && showcmd != CMD_LIST_AMBIGUOUS);
- if (c->doc && c->doc_allocated)
- xfree ((char *) c->doc);
- if (showcmd->doc && showcmd->doc_allocated)
- xfree ((char *) showcmd->doc);
- if (info_verbose)
- {
- c->doc = _("Set verbose printing of informational messages.");
- showcmd->doc = _("Show verbose printing of informational messages.");
- }
- else
- {
- c->doc = _("Set verbosity.");
- showcmd->doc = _("Show verbosity.");
- }
- c->doc_allocated = 0;
- showcmd->doc_allocated = 0;
- }
- /* Init the history buffer. Note that we are called after the init file(s)
- have been read so that the user can change the history file via his
- .gdbinit file (for instance). The GDBHISTFILE environment variable
- overrides all of this. */
- void
- init_history (void)
- {
- const char *tmpenv;
- tmpenv = getenv ("GDBHISTSIZE");
- if (tmpenv)
- {
- long var;
- int saved_errno;
- char *endptr;
- tmpenv = skip_spaces (tmpenv);
- errno = 0;
- var = strtol (tmpenv, &endptr, 10);
- saved_errno = errno;
- endptr = skip_spaces (endptr);
- /* If GDBHISTSIZE is non-numeric then ignore it. If GDBHISTSIZE is the
- empty string, a negative number or a huge positive number (larger than
- INT_MAX) then set the history size to unlimited. Otherwise set our
- history size to the number we have read. This behavior is consistent
- with how bash handles HISTSIZE. */
- if (*endptr != '\0')
- ;
- else if (*tmpenv == '\0'
- || var < 0
- || var > INT_MAX
- /* On targets where INT_MAX == LONG_MAX, we have to look at
- errno after calling strtol to distinguish between a value that
- is exactly INT_MAX and an overflowing value that was clamped
- to INT_MAX. */
- || (var == INT_MAX && saved_errno == ERANGE))
- history_size_setshow_var = -1;
- else
- history_size_setshow_var = var;
- }
- /* If neither the init file nor GDBHISTSIZE has set a size yet, pick the
- default. */
- if (history_size_setshow_var == -2)
- history_size_setshow_var = 256;
- set_readline_history_size (history_size_setshow_var);
- if (!history_filename.empty ())
- read_history (history_filename.c_str ());
- }
- static void
- show_prompt (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- gdb_printf (file, _("Gdb's prompt is \"%s\".\n"), value);
- }
- /* "set editing" command. */
- static void
- set_editing (const char *args, int from_tty, struct cmd_list_element *c)
- {
- change_line_handler (set_editing_cmd_var);
- /* Update the control variable so that MI's =cmd-param-changed event
- shows the correct value. */
- set_editing_cmd_var = current_ui->command_editing;
- }
- static void
- show_editing (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- gdb_printf (file, _("Editing of command lines as "
- "they are typed is %s.\n"),
- current_ui->command_editing ? _("on") : _("off"));
- }
- static void
- show_annotation_level (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- gdb_printf (file, _("Annotation_level is %s.\n"), value);
- }
- static void
- show_exec_done_display_p (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- gdb_printf (file, _("Notification of completion for "
- "asynchronous execution commands is %s.\n"),
- value);
- }
- /* New values of the "data-directory" parameter are staged here.
- Extension languages, for example Python's gdb.parameter API, will read
- the value directory from this variable, so we must ensure that this
- always contains the correct value. */
- static std::string staged_gdb_datadir;
- /* "set" command for the gdb_datadir configuration variable. */
- static void
- set_gdb_datadir (const char *args, int from_tty, struct cmd_list_element *c)
- {
- set_gdb_data_directory (staged_gdb_datadir.c_str ());
- /* SET_GDB_DATA_DIRECTORY will resolve relative paths in
- STAGED_GDB_DATADIR, so we now copy the value from GDB_DATADIR
- back into STAGED_GDB_DATADIR so the extension languages can read the
- correct value. */
- staged_gdb_datadir = gdb_datadir;
- gdb::observers::gdb_datadir_changed.notify ();
- }
- /* "show" command for the gdb_datadir configuration variable. */
- static void
- show_gdb_datadir (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- gdb_printf (file, _("GDB's data directory is \"%ps\".\n"),
- styled_string (file_name_style.style (),
- gdb_datadir.c_str ()));
- }
- /* Implement 'set history filename'. */
- static void
- set_history_filename (const char *args,
- int from_tty, struct cmd_list_element *c)
- {
- /* We include the current directory so that if the user changes
- directories the file written will be the same as the one
- that was read. */
- if (!history_filename.empty ()
- && !IS_ABSOLUTE_PATH (history_filename.c_str ()))
- {
- gdb::unique_xmalloc_ptr<char> temp
- (gdb_abspath (history_filename.c_str ()));
- history_filename = temp.get ();
- }
- }
- /* Whether we're in quiet startup mode. */
- static bool startup_quiet;
- /* See top.h. */
- bool
- check_quiet_mode ()
- {
- return startup_quiet;
- }
- /* Show whether GDB should start up in quiet mode. */
- static void
- show_startup_quiet (struct ui_file *file, int from_tty,
- struct cmd_list_element *c, const char *value)
- {
- gdb_printf (file, _("Whether to start up quietly is %s.\n"),
- value);
- }
- static void
- init_gdb_version_vars (void)
- {
- struct internalvar *major_version_var = create_internalvar ("_gdb_major");
- struct internalvar *minor_version_var = create_internalvar ("_gdb_minor");
- int vmajor = 0, vminor = 0, vrevision = 0;
- sscanf (version, "%d.%d.%d", &vmajor, &vminor, &vrevision);
- set_internalvar_integer (major_version_var, vmajor);
- set_internalvar_integer (minor_version_var, vminor + (vrevision > 0));
- }
- static void
- init_main (void)
- {
- struct cmd_list_element *c;
- /* Initialize the prompt to a simple "(gdb) " prompt or to whatever
- the DEFAULT_PROMPT is. */
- set_prompt (DEFAULT_PROMPT);
- /* Set the important stuff up for command editing. */
- command_editing_p = 1;
- history_expansion_p = 0;
- write_history_p = 0;
- /* Setup important stuff for command line editing. */
- rl_completion_word_break_hook = gdb_completion_word_break_characters;
- rl_attempted_completion_function = gdb_rl_attempted_completion_function;
- set_rl_completer_word_break_characters (default_word_break_characters ());
- rl_completer_quote_characters = get_gdb_completer_quote_characters ();
- rl_completion_display_matches_hook = cli_display_match_list;
- rl_readline_name = "gdb";
- rl_terminal_name = getenv ("TERM");
- /* The name for this defun comes from Bash, where it originated.
- 15 is Control-o, the same binding this function has in Bash. */
- rl_add_defun ("operate-and-get-next", gdb_rl_operate_and_get_next, 15);
- add_setshow_string_cmd ("prompt", class_support,
- &top_prompt,
- _("Set gdb's prompt."),
- _("Show gdb's prompt."),
- NULL, NULL,
- show_prompt,
- &setlist, &showlist);
- add_com ("dont-repeat", class_support, dont_repeat_command, _("\
- Don't repeat this command.\nPrimarily \
- used inside of user-defined commands that should not be repeated when\n\
- hitting return."));
- add_setshow_boolean_cmd ("editing", class_support,
- &set_editing_cmd_var, _("\
- Set editing of command lines as they are typed."), _("\
- Show editing of command lines as they are typed."), _("\
- Use \"on\" to enable the editing, and \"off\" to disable it.\n\
- Without an argument, command line editing is enabled. To edit, use\n\
- EMACS-like or VI-like commands like control-P or ESC."),
- set_editing,
- show_editing,
- &setlist, &showlist);
- add_setshow_boolean_cmd ("save", no_class, &write_history_p, _("\
- Set saving of the history record on exit."), _("\
- Show saving of the history record on exit."), _("\
- Use \"on\" to enable the saving, and \"off\" to disable it.\n\
- Without an argument, saving is enabled."),
- NULL,
- show_write_history_p,
- &sethistlist, &showhistlist);
- add_setshow_zuinteger_unlimited_cmd ("size", no_class,
- &history_size_setshow_var, _("\
- Set the size of the command history."), _("\
- Show the size of the command history."), _("\
- This is the number of previous commands to keep a record of.\n\
- If set to \"unlimited\", the number of commands kept in the history\n\
- list is unlimited. This defaults to the value of the environment\n\
- variable \"GDBHISTSIZE\", or to 256 if this variable is not set."),
- set_history_size_command,
- show_history_size,
- &sethistlist, &showhistlist);
- add_setshow_zuinteger_unlimited_cmd ("remove-duplicates", no_class,
- &history_remove_duplicates, _("\
- Set how far back in history to look for and remove duplicate entries."), _("\
- Show how far back in history to look for and remove duplicate entries."), _("\
- If set to a nonzero value N, GDB will look back at the last N history entries\n\
- and remove the first history entry that is a duplicate of the most recent\n\
- entry, each time a new history entry is added.\n\
- If set to \"unlimited\", this lookbehind is unbounded.\n\
- Only history entries added during this session are considered for removal.\n\
- If set to 0, removal of duplicate history entries is disabled.\n\
- By default this option is set to 0."),
- NULL,
- show_history_remove_duplicates,
- &sethistlist, &showhistlist);
- add_setshow_optional_filename_cmd ("filename", no_class, &history_filename, _("\
- Set the filename in which to record the command history."), _("\
- Show the filename in which to record the command history."), _("\
- (the list of previous commands of which a record is kept)."),
- set_history_filename,
- show_history_filename,
- &sethistlist, &showhistlist);
- add_setshow_boolean_cmd ("confirm", class_support, &confirm, _("\
- Set whether to confirm potentially dangerous operations."), _("\
- Show whether to confirm potentially dangerous operations."), NULL,
- NULL,
- show_confirm,
- &setlist, &showlist);
- add_setshow_zinteger_cmd ("annotate", class_obscure, &annotation_level, _("\
- Set annotation_level."), _("\
- Show annotation_level."), _("\
- 0 == normal; 1 == fullname (for use when running under emacs)\n\
- 2 == output annotated suitably for use by programs that control GDB."),
- NULL,
- show_annotation_level,
- &setlist, &showlist);
- add_setshow_boolean_cmd ("exec-done-display", class_support,
- &exec_done_display_p, _("\
- Set notification of completion for asynchronous execution commands."), _("\
- Show notification of completion for asynchronous execution commands."), _("\
- Use \"on\" to enable the notification, and \"off\" to disable it."),
- NULL,
- show_exec_done_display_p,
- &setlist, &showlist);
- add_setshow_filename_cmd ("data-directory", class_maintenance,
- &staged_gdb_datadir, _("Set GDB's data directory."),
- _("Show GDB's data directory."),
- _("\
- When set, GDB uses the specified path to search for data files."),
- set_gdb_datadir, show_gdb_datadir,
- &setlist,
- &showlist);
- /* Prime the initial value for data-directory. */
- staged_gdb_datadir = gdb_datadir;
- add_setshow_auto_boolean_cmd ("interactive-mode", class_support,
- &interactive_mode, _("\
- Set whether GDB's standard input is a terminal."), _("\
- Show whether GDB's standard input is a terminal."), _("\
- If on, GDB assumes that standard input is a terminal. In practice, it\n\
- means that GDB should wait for the user to answer queries associated to\n\
- commands entered at the command prompt. If off, GDB assumes that standard\n\
- input is not a terminal, and uses the default answer to all queries.\n\
- If auto (the default), determine which mode to use based on the standard\n\
- input settings."),
- NULL,
- show_interactive_mode,
- &setlist, &showlist);
- add_setshow_boolean_cmd ("startup-quietly", class_support,
- &startup_quiet, _("\
- Set whether GDB should start up quietly."), _(" \
- Show whether GDB should start up quietly."), _("\
- This setting will not affect the current session. Instead this command\n\
- should be added to the .gdbearlyinit file in the users home directory to\n\
- affect future GDB sessions."),
- NULL,
- show_startup_quiet,
- &setlist, &showlist);
- c = add_cmd ("new-ui", class_support, new_ui_command, _("\
- Create a new UI.\n\
- Usage: new-ui INTERPRETER TTY\n\
- The first argument is the name of the interpreter to run.\n\
- The second argument is the terminal the UI runs on."), &cmdlist);
- set_cmd_completer (c, interpreter_completer);
- }
- /* See top.h. */
- void
- gdb_init ()
- {
- saved_command_line = xstrdup ("");
- previous_saved_command_line = xstrdup ("");
- /* Run the init function of each source file. */
- #ifdef __MSDOS__
- /* Make sure we return to the original directory upon exit, come
- what may, since the OS doesn't do that for us. */
- make_final_cleanup (do_chdir_cleanup, xstrdup (current_directory));
- #endif
- init_cmd_lists (); /* This needs to be done first. */
- init_page_info ();
- /* Here is where we call all the _initialize_foo routines. */
- initialize_all_files ();
- /* This creates the current_program_space. Do this after all the
- _initialize_foo routines have had a chance to install their
- per-sspace data keys. Also do this before
- initialize_current_architecture is called, because it accesses
- exec_bfd of the current program space. */
- initialize_progspace ();
- initialize_inferiors ();
- initialize_current_architecture ();
- init_main (); /* But that omits this file! Do it now. */
- initialize_stdin_serial ();
- /* Take a snapshot of our tty state before readline/ncurses have had a chance
- to alter it. */
- set_initial_gdb_ttystate ();
- gdb_init_signals ();
- /* We need a default language for parsing expressions, so simple
- things like "set width 0" won't fail if no language is explicitly
- set in a config file or implicitly set by reading an executable
- during startup. */
- set_language (language_c);
- expected_language = current_language; /* Don't warn about the change. */
- /* Create $_gdb_major and $_gdb_minor convenience variables. */
- init_gdb_version_vars ();
- }
- void _initialize_top ();
- void
- _initialize_top ()
- {
- /* Determine a default value for the history filename. */
- const char *tmpenv = getenv ("GDBHISTFILE");
- if (tmpenv != nullptr)
- history_filename = tmpenv;
- else
- {
- /* We include the current directory so that if the user changes
- directories the file written will be the same as the one
- that was read. */
- #ifdef __MSDOS__
- /* No leading dots in file names are allowed on MSDOS. */
- const char *fname = "_gdb_history";
- #else
- const char *fname = ".gdb_history";
- #endif
- gdb::unique_xmalloc_ptr<char> temp (gdb_abspath (fname));
- history_filename = temp.get ();
- }
- }
|