15796c8dcSSimon Schubert /* Top level stuff for GDB, the GNU debugger. 25796c8dcSSimon Schubert 35796c8dcSSimon Schubert Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 45796c8dcSSimon Schubert 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 5*c50c785cSJohn Marino 2009, 2010, 2011 Free Software Foundation, Inc. 65796c8dcSSimon Schubert 75796c8dcSSimon Schubert This file is part of GDB. 85796c8dcSSimon Schubert 95796c8dcSSimon Schubert This program is free software; you can redistribute it and/or modify 105796c8dcSSimon Schubert it under the terms of the GNU General Public License as published by 115796c8dcSSimon Schubert the Free Software Foundation; either version 3 of the License, or 125796c8dcSSimon Schubert (at your option) any later version. 135796c8dcSSimon Schubert 145796c8dcSSimon Schubert This program is distributed in the hope that it will be useful, 155796c8dcSSimon Schubert but WITHOUT ANY WARRANTY; without even the implied warranty of 165796c8dcSSimon Schubert MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 175796c8dcSSimon Schubert GNU General Public License for more details. 185796c8dcSSimon Schubert 195796c8dcSSimon Schubert You should have received a copy of the GNU General Public License 205796c8dcSSimon Schubert along with this program. If not, see <http://www.gnu.org/licenses/>. */ 215796c8dcSSimon Schubert 225796c8dcSSimon Schubert #include "defs.h" 235796c8dcSSimon Schubert #include "top.h" 245796c8dcSSimon Schubert #include "target.h" 255796c8dcSSimon Schubert #include "inferior.h" 265796c8dcSSimon Schubert #include "symfile.h" 275796c8dcSSimon Schubert #include "gdbcore.h" 285796c8dcSSimon Schubert 295796c8dcSSimon Schubert #include "exceptions.h" 305796c8dcSSimon Schubert #include "getopt.h" 315796c8dcSSimon Schubert 325796c8dcSSimon Schubert #include <sys/types.h> 335796c8dcSSimon Schubert #include "gdb_stat.h" 345796c8dcSSimon Schubert #include <ctype.h> 355796c8dcSSimon Schubert 365796c8dcSSimon Schubert #include "gdb_string.h" 375796c8dcSSimon Schubert #include "event-loop.h" 385796c8dcSSimon Schubert #include "ui-out.h" 395796c8dcSSimon Schubert 405796c8dcSSimon Schubert #include "interps.h" 415796c8dcSSimon Schubert #include "main.h" 425796c8dcSSimon Schubert #include "source.h" 43cf7f2e2dSJohn Marino #include "cli/cli-cmds.h" 44cf7f2e2dSJohn Marino #include "python/python.h" 45*c50c785cSJohn Marino #include "objfiles.h" 465796c8dcSSimon Schubert 475796c8dcSSimon Schubert /* The selected interpreter. This will be used as a set command 485796c8dcSSimon Schubert variable, so it should always be malloc'ed - since 495796c8dcSSimon Schubert do_setshow_command will free it. */ 505796c8dcSSimon Schubert char *interpreter_p; 515796c8dcSSimon Schubert 52*c50c785cSJohn Marino /* Whether xdb commands will be handled. */ 535796c8dcSSimon Schubert int xdb_commands = 0; 545796c8dcSSimon Schubert 55*c50c785cSJohn Marino /* Whether dbx commands will be handled. */ 565796c8dcSSimon Schubert int dbx_commands = 0; 575796c8dcSSimon Schubert 585796c8dcSSimon Schubert /* System root path, used to find libraries etc. */ 595796c8dcSSimon Schubert char *gdb_sysroot = 0; 605796c8dcSSimon Schubert 615796c8dcSSimon Schubert /* GDB datadir, used to store data files. */ 625796c8dcSSimon Schubert char *gdb_datadir = 0; 635796c8dcSSimon Schubert 64cf7f2e2dSJohn Marino /* If gdb was configured with --with-python=/path, 65cf7f2e2dSJohn Marino the possibly relocated path to python's lib directory. */ 66cf7f2e2dSJohn Marino char *python_libdir = 0; 67cf7f2e2dSJohn Marino 685796c8dcSSimon Schubert struct ui_file *gdb_stdout; 695796c8dcSSimon Schubert struct ui_file *gdb_stderr; 705796c8dcSSimon Schubert struct ui_file *gdb_stdlog; 715796c8dcSSimon Schubert struct ui_file *gdb_stdin; 72*c50c785cSJohn Marino /* Target IO streams. */ 735796c8dcSSimon Schubert struct ui_file *gdb_stdtargin; 745796c8dcSSimon Schubert struct ui_file *gdb_stdtarg; 755796c8dcSSimon Schubert struct ui_file *gdb_stdtargerr; 765796c8dcSSimon Schubert 77cf7f2e2dSJohn Marino /* True if --batch or --batch-silent was seen. */ 78cf7f2e2dSJohn Marino int batch_flag = 0; 79cf7f2e2dSJohn Marino 805796c8dcSSimon Schubert /* Support for the --batch-silent option. */ 815796c8dcSSimon Schubert int batch_silent = 0; 825796c8dcSSimon Schubert 835796c8dcSSimon Schubert /* Support for --return-child-result option. 845796c8dcSSimon Schubert Set the default to -1 to return error in the case 855796c8dcSSimon Schubert that the program does not run or does not complete. */ 865796c8dcSSimon Schubert int return_child_result = 0; 875796c8dcSSimon Schubert int return_child_result_value = -1; 885796c8dcSSimon Schubert 89*c50c785cSJohn Marino /* Whether to enable writing into executable and core files. */ 905796c8dcSSimon Schubert extern int write_files; 915796c8dcSSimon Schubert 925796c8dcSSimon Schubert /* GDB as it has been invoked from the command line (i.e. argv[0]). */ 935796c8dcSSimon Schubert static char *gdb_program_name; 945796c8dcSSimon Schubert 955796c8dcSSimon Schubert static void print_gdb_help (struct ui_file *); 965796c8dcSSimon Schubert 97*c50c785cSJohn Marino /* These two are used to set the external editor commands when gdb is 98*c50c785cSJohn Marino farming out files to be edited by another program. */ 995796c8dcSSimon Schubert 1005796c8dcSSimon Schubert extern char *external_editor_command; 1015796c8dcSSimon Schubert 1025796c8dcSSimon Schubert /* Relocate a file or directory. PROGNAME is the name by which gdb 1035796c8dcSSimon Schubert was invoked (i.e., argv[0]). INITIAL is the default value for the 1045796c8dcSSimon Schubert file or directory. FLAG is true if the value is relocatable, false 1055796c8dcSSimon Schubert otherwise. Returns a newly allocated string; this may return NULL 1065796c8dcSSimon Schubert under the same conditions as make_relative_prefix. */ 1075796c8dcSSimon Schubert static char * 1085796c8dcSSimon Schubert relocate_path (const char *progname, const char *initial, int flag) 1095796c8dcSSimon Schubert { 1105796c8dcSSimon Schubert if (flag) 1115796c8dcSSimon Schubert return make_relative_prefix (progname, BINDIR, initial); 1125796c8dcSSimon Schubert return xstrdup (initial); 1135796c8dcSSimon Schubert } 1145796c8dcSSimon Schubert 1155796c8dcSSimon Schubert /* Like relocate_path, but specifically checks for a directory. 1165796c8dcSSimon Schubert INITIAL is relocated according to the rules of relocate_path. If 1175796c8dcSSimon Schubert the result is a directory, it is used; otherwise, INITIAL is used. 1185796c8dcSSimon Schubert The chosen directory is then canonicalized using lrealpath. This 1195796c8dcSSimon Schubert function always returns a newly-allocated string. */ 1205796c8dcSSimon Schubert static char * 1215796c8dcSSimon Schubert relocate_directory (const char *progname, const char *initial, int flag) 1225796c8dcSSimon Schubert { 1235796c8dcSSimon Schubert char *dir; 1245796c8dcSSimon Schubert 1255796c8dcSSimon Schubert dir = relocate_path (progname, initial, flag); 1265796c8dcSSimon Schubert if (dir) 1275796c8dcSSimon Schubert { 1285796c8dcSSimon Schubert struct stat s; 1295796c8dcSSimon Schubert 1305796c8dcSSimon Schubert if (stat (dir, &s) != 0 || !S_ISDIR (s.st_mode)) 1315796c8dcSSimon Schubert { 1325796c8dcSSimon Schubert xfree (dir); 1335796c8dcSSimon Schubert dir = NULL; 1345796c8dcSSimon Schubert } 1355796c8dcSSimon Schubert } 1365796c8dcSSimon Schubert if (!dir) 1375796c8dcSSimon Schubert dir = xstrdup (initial); 1385796c8dcSSimon Schubert 1395796c8dcSSimon Schubert /* Canonicalize the directory. */ 1405796c8dcSSimon Schubert if (*dir) 1415796c8dcSSimon Schubert { 1425796c8dcSSimon Schubert char *canon_sysroot = lrealpath (dir); 143cf7f2e2dSJohn Marino 1445796c8dcSSimon Schubert if (canon_sysroot) 1455796c8dcSSimon Schubert { 1465796c8dcSSimon Schubert xfree (dir); 1475796c8dcSSimon Schubert dir = canon_sysroot; 1485796c8dcSSimon Schubert } 1495796c8dcSSimon Schubert } 1505796c8dcSSimon Schubert 1515796c8dcSSimon Schubert return dir; 1525796c8dcSSimon Schubert } 1535796c8dcSSimon Schubert 154*c50c785cSJohn Marino /* Compute the locations of init files that GDB should source and 155*c50c785cSJohn Marino return them in SYSTEM_GDBINIT, HOME_GDBINIT, LOCAL_GDBINIT. If 156*c50c785cSJohn Marino there is no system gdbinit (resp. home gdbinit and local gdbinit) 157*c50c785cSJohn Marino to be loaded, then SYSTEM_GDBINIT (resp. HOME_GDBINIT and 158*c50c785cSJohn Marino LOCAL_GDBINIT) is set to NULL. */ 1595796c8dcSSimon Schubert static void 1605796c8dcSSimon Schubert get_init_files (char **system_gdbinit, 1615796c8dcSSimon Schubert char **home_gdbinit, 1625796c8dcSSimon Schubert char **local_gdbinit) 1635796c8dcSSimon Schubert { 1645796c8dcSSimon Schubert static char *sysgdbinit = NULL; 1655796c8dcSSimon Schubert static char *homeinit = NULL; 1665796c8dcSSimon Schubert static char *localinit = NULL; 1675796c8dcSSimon Schubert static int initialized = 0; 1685796c8dcSSimon Schubert 1695796c8dcSSimon Schubert if (!initialized) 1705796c8dcSSimon Schubert { 1715796c8dcSSimon Schubert struct stat homebuf, cwdbuf, s; 1725796c8dcSSimon Schubert char *homedir, *relocated_sysgdbinit; 1735796c8dcSSimon Schubert 1745796c8dcSSimon Schubert if (SYSTEM_GDBINIT[0]) 1755796c8dcSSimon Schubert { 1765796c8dcSSimon Schubert relocated_sysgdbinit = relocate_path (gdb_program_name, 1775796c8dcSSimon Schubert SYSTEM_GDBINIT, 1785796c8dcSSimon Schubert SYSTEM_GDBINIT_RELOCATABLE); 1795796c8dcSSimon Schubert if (relocated_sysgdbinit && stat (relocated_sysgdbinit, &s) == 0) 1805796c8dcSSimon Schubert sysgdbinit = relocated_sysgdbinit; 1815796c8dcSSimon Schubert else 1825796c8dcSSimon Schubert xfree (relocated_sysgdbinit); 1835796c8dcSSimon Schubert } 1845796c8dcSSimon Schubert 1855796c8dcSSimon Schubert homedir = getenv ("HOME"); 1865796c8dcSSimon Schubert 1875796c8dcSSimon Schubert /* If the .gdbinit file in the current directory is the same as 1885796c8dcSSimon Schubert the $HOME/.gdbinit file, it should not be sourced. homebuf 1895796c8dcSSimon Schubert and cwdbuf are used in that purpose. Make sure that the stats 1905796c8dcSSimon Schubert are zero in case one of them fails (this guarantees that they 1915796c8dcSSimon Schubert won't match if either exists). */ 1925796c8dcSSimon Schubert 1935796c8dcSSimon Schubert memset (&homebuf, 0, sizeof (struct stat)); 1945796c8dcSSimon Schubert memset (&cwdbuf, 0, sizeof (struct stat)); 1955796c8dcSSimon Schubert 1965796c8dcSSimon Schubert if (homedir) 1975796c8dcSSimon Schubert { 1985796c8dcSSimon Schubert homeinit = xstrprintf ("%s/%s", homedir, gdbinit); 1995796c8dcSSimon Schubert if (stat (homeinit, &homebuf) != 0) 2005796c8dcSSimon Schubert { 2015796c8dcSSimon Schubert xfree (homeinit); 2025796c8dcSSimon Schubert homeinit = NULL; 2035796c8dcSSimon Schubert } 2045796c8dcSSimon Schubert } 2055796c8dcSSimon Schubert 2065796c8dcSSimon Schubert if (stat (gdbinit, &cwdbuf) == 0) 2075796c8dcSSimon Schubert { 2085796c8dcSSimon Schubert if (!homeinit 2095796c8dcSSimon Schubert || memcmp ((char *) &homebuf, (char *) &cwdbuf, 2105796c8dcSSimon Schubert sizeof (struct stat))) 2115796c8dcSSimon Schubert localinit = gdbinit; 2125796c8dcSSimon Schubert } 2135796c8dcSSimon Schubert 2145796c8dcSSimon Schubert initialized = 1; 2155796c8dcSSimon Schubert } 2165796c8dcSSimon Schubert 2175796c8dcSSimon Schubert *system_gdbinit = sysgdbinit; 2185796c8dcSSimon Schubert *home_gdbinit = homeinit; 2195796c8dcSSimon Schubert *local_gdbinit = localinit; 2205796c8dcSSimon Schubert } 2215796c8dcSSimon Schubert 2225796c8dcSSimon Schubert /* Call command_loop. If it happens to return, pass that through as a 2235796c8dcSSimon Schubert non-zero return status. */ 2245796c8dcSSimon Schubert 2255796c8dcSSimon Schubert static int 2265796c8dcSSimon Schubert captured_command_loop (void *data) 2275796c8dcSSimon Schubert { 2285796c8dcSSimon Schubert current_interp_command_loop (); 2295796c8dcSSimon Schubert /* FIXME: cagney/1999-11-05: A correct command_loop() implementaton 2305796c8dcSSimon Schubert would clean things up (restoring the cleanup chain) to the state 2315796c8dcSSimon Schubert they were just prior to the call. Technically, this means that 2325796c8dcSSimon Schubert the do_cleanups() below is redundant. Unfortunately, many FUNCs 2335796c8dcSSimon Schubert are not that well behaved. do_cleanups should either be replaced 2345796c8dcSSimon Schubert with a do_cleanups call (to cover the problem) or an assertion 2355796c8dcSSimon Schubert check to detect bad FUNCs code. */ 2365796c8dcSSimon Schubert do_cleanups (ALL_CLEANUPS); 2375796c8dcSSimon Schubert /* If the command_loop returned, normally (rather than threw an 2385796c8dcSSimon Schubert error) we try to quit. If the quit is aborted, catch_errors() 2395796c8dcSSimon Schubert which called this catch the signal and restart the command 2405796c8dcSSimon Schubert loop. */ 2415796c8dcSSimon Schubert quit_command (NULL, instream == stdin); 2425796c8dcSSimon Schubert return 1; 2435796c8dcSSimon Schubert } 2445796c8dcSSimon Schubert 2455796c8dcSSimon Schubert static int 2465796c8dcSSimon Schubert captured_main (void *data) 2475796c8dcSSimon Schubert { 2485796c8dcSSimon Schubert struct captured_main_args *context = data; 2495796c8dcSSimon Schubert int argc = context->argc; 2505796c8dcSSimon Schubert char **argv = context->argv; 2515796c8dcSSimon Schubert static int quiet = 0; 2525796c8dcSSimon Schubert static int set_args = 0; 2535796c8dcSSimon Schubert 2545796c8dcSSimon Schubert /* Pointers to various arguments from command line. */ 2555796c8dcSSimon Schubert char *symarg = NULL; 2565796c8dcSSimon Schubert char *execarg = NULL; 2575796c8dcSSimon Schubert char *pidarg = NULL; 2585796c8dcSSimon Schubert char *corearg = NULL; 2595796c8dcSSimon Schubert char *pid_or_core_arg = NULL; 2605796c8dcSSimon Schubert char *cdarg = NULL; 2615796c8dcSSimon Schubert char *ttyarg = NULL; 2625796c8dcSSimon Schubert 263*c50c785cSJohn Marino /* These are static so that we can take their address in an 264*c50c785cSJohn Marino initializer. */ 2655796c8dcSSimon Schubert static int print_help; 2665796c8dcSSimon Schubert static int print_version; 2675796c8dcSSimon Schubert 2685796c8dcSSimon Schubert /* Pointers to all arguments of --command option. */ 2695796c8dcSSimon Schubert struct cmdarg { 2705796c8dcSSimon Schubert enum { 2715796c8dcSSimon Schubert CMDARG_FILE, 2725796c8dcSSimon Schubert CMDARG_COMMAND 2735796c8dcSSimon Schubert } type; 2745796c8dcSSimon Schubert char *string; 2755796c8dcSSimon Schubert } *cmdarg; 2765796c8dcSSimon Schubert /* Allocated size of cmdarg. */ 2775796c8dcSSimon Schubert int cmdsize; 2785796c8dcSSimon Schubert /* Number of elements of cmdarg used. */ 2795796c8dcSSimon Schubert int ncmd; 2805796c8dcSSimon Schubert 2815796c8dcSSimon Schubert /* Indices of all arguments of --directory option. */ 2825796c8dcSSimon Schubert char **dirarg; 2835796c8dcSSimon Schubert /* Allocated size. */ 2845796c8dcSSimon Schubert int dirsize; 2855796c8dcSSimon Schubert /* Number of elements used. */ 2865796c8dcSSimon Schubert int ndir; 2875796c8dcSSimon Schubert 2885796c8dcSSimon Schubert /* gdb init files. */ 2895796c8dcSSimon Schubert char *system_gdbinit; 2905796c8dcSSimon Schubert char *home_gdbinit; 2915796c8dcSSimon Schubert char *local_gdbinit; 2925796c8dcSSimon Schubert 2935796c8dcSSimon Schubert int i; 294cf7f2e2dSJohn Marino int save_auto_load; 295*c50c785cSJohn Marino struct objfile *objfile; 2965796c8dcSSimon Schubert 297cf7f2e2dSJohn Marino struct cleanup *pre_stat_chain = make_command_stats_cleanup (0); 2985796c8dcSSimon Schubert 2995796c8dcSSimon Schubert #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES) 3005796c8dcSSimon Schubert setlocale (LC_MESSAGES, ""); 3015796c8dcSSimon Schubert #endif 3025796c8dcSSimon Schubert #if defined (HAVE_SETLOCALE) 3035796c8dcSSimon Schubert setlocale (LC_CTYPE, ""); 3045796c8dcSSimon Schubert #endif 3055796c8dcSSimon Schubert bindtextdomain (PACKAGE, LOCALEDIR); 3065796c8dcSSimon Schubert textdomain (PACKAGE); 3075796c8dcSSimon Schubert 3085796c8dcSSimon Schubert #ifdef HAVE_SBRK 3095796c8dcSSimon Schubert lim_at_start = (char *) sbrk (0); 3105796c8dcSSimon Schubert #endif 3115796c8dcSSimon Schubert 3125796c8dcSSimon Schubert cmdsize = 1; 3135796c8dcSSimon Schubert cmdarg = (struct cmdarg *) xmalloc (cmdsize * sizeof (*cmdarg)); 3145796c8dcSSimon Schubert ncmd = 0; 3155796c8dcSSimon Schubert dirsize = 1; 3165796c8dcSSimon Schubert dirarg = (char **) xmalloc (dirsize * sizeof (*dirarg)); 3175796c8dcSSimon Schubert ndir = 0; 3185796c8dcSSimon Schubert 3195796c8dcSSimon Schubert quit_flag = 0; 3205796c8dcSSimon Schubert line = (char *) xmalloc (linesize); 321*c50c785cSJohn Marino line[0] = '\0'; /* Terminate saved (now empty) cmd line. */ 3225796c8dcSSimon Schubert instream = stdin; 3235796c8dcSSimon Schubert 3245796c8dcSSimon Schubert gdb_stdout = stdio_fileopen (stdout); 3255796c8dcSSimon Schubert gdb_stderr = stdio_fileopen (stderr); 3265796c8dcSSimon Schubert gdb_stdlog = gdb_stderr; /* for moment */ 3275796c8dcSSimon Schubert gdb_stdtarg = gdb_stderr; /* for moment */ 3285796c8dcSSimon Schubert gdb_stdin = stdio_fileopen (stdin); 3295796c8dcSSimon Schubert gdb_stdtargerr = gdb_stderr; /* for moment */ 3305796c8dcSSimon Schubert gdb_stdtargin = gdb_stdin; /* for moment */ 3315796c8dcSSimon Schubert 3325796c8dcSSimon Schubert gdb_program_name = xstrdup (argv[0]); 3335796c8dcSSimon Schubert 3345796c8dcSSimon Schubert if (! getcwd (gdb_dirbuf, sizeof (gdb_dirbuf))) 3355796c8dcSSimon Schubert /* Don't use *_filtered or warning() (which relies on 3365796c8dcSSimon Schubert current_target) until after initialize_all_files(). */ 3375796c8dcSSimon Schubert fprintf_unfiltered (gdb_stderr, 338*c50c785cSJohn Marino _("%s: warning: error finding " 339*c50c785cSJohn Marino "working directory: %s\n"), 3405796c8dcSSimon Schubert argv[0], safe_strerror (errno)); 3415796c8dcSSimon Schubert 3425796c8dcSSimon Schubert current_directory = gdb_dirbuf; 3435796c8dcSSimon Schubert 3445796c8dcSSimon Schubert /* Set the sysroot path. */ 3455796c8dcSSimon Schubert gdb_sysroot = relocate_directory (argv[0], TARGET_SYSTEM_ROOT, 3465796c8dcSSimon Schubert TARGET_SYSTEM_ROOT_RELOCATABLE); 3475796c8dcSSimon Schubert 3485796c8dcSSimon Schubert debug_file_directory = relocate_directory (argv[0], DEBUGDIR, 3495796c8dcSSimon Schubert DEBUGDIR_RELOCATABLE); 3505796c8dcSSimon Schubert 3515796c8dcSSimon Schubert gdb_datadir = relocate_directory (argv[0], GDB_DATADIR, 3525796c8dcSSimon Schubert GDB_DATADIR_RELOCATABLE); 3535796c8dcSSimon Schubert 354cf7f2e2dSJohn Marino #ifdef WITH_PYTHON_PATH 355*c50c785cSJohn Marino { 356cf7f2e2dSJohn Marino /* For later use in helping Python find itself. */ 357*c50c785cSJohn Marino char *tmp = concat (WITH_PYTHON_PATH, SLASH_STRING, "lib", NULL); 358*c50c785cSJohn Marino 359*c50c785cSJohn Marino python_libdir = relocate_directory (argv[0], tmp, 360cf7f2e2dSJohn Marino PYTHON_PATH_RELOCATABLE); 361*c50c785cSJohn Marino xfree (tmp); 362*c50c785cSJohn Marino } 363cf7f2e2dSJohn Marino #endif 364cf7f2e2dSJohn Marino 3655796c8dcSSimon Schubert #ifdef RELOC_SRCDIR 3665796c8dcSSimon Schubert add_substitute_path_rule (RELOC_SRCDIR, 3675796c8dcSSimon Schubert make_relative_prefix (argv[0], BINDIR, 3685796c8dcSSimon Schubert RELOC_SRCDIR)); 3695796c8dcSSimon Schubert #endif 3705796c8dcSSimon Schubert 3715796c8dcSSimon Schubert /* There will always be an interpreter. Either the one passed into 3725796c8dcSSimon Schubert this captured main, or one specified by the user at start up, or 3735796c8dcSSimon Schubert the console. Initialize the interpreter to the one requested by 3745796c8dcSSimon Schubert the application. */ 3755796c8dcSSimon Schubert interpreter_p = xstrdup (context->interpreter_p); 3765796c8dcSSimon Schubert 3775796c8dcSSimon Schubert /* Parse arguments and options. */ 3785796c8dcSSimon Schubert { 3795796c8dcSSimon Schubert int c; 3805796c8dcSSimon Schubert /* When var field is 0, use flag field to record the equivalent 3815796c8dcSSimon Schubert short option (or arbitrary numbers starting at 10 for those 3825796c8dcSSimon Schubert with no equivalent). */ 3835796c8dcSSimon Schubert enum { 3845796c8dcSSimon Schubert OPT_SE = 10, 3855796c8dcSSimon Schubert OPT_CD, 3865796c8dcSSimon Schubert OPT_ANNOTATE, 3875796c8dcSSimon Schubert OPT_STATISTICS, 3885796c8dcSSimon Schubert OPT_TUI, 3895796c8dcSSimon Schubert OPT_NOWINDOWS, 3905796c8dcSSimon Schubert OPT_WINDOWS 3915796c8dcSSimon Schubert }; 3925796c8dcSSimon Schubert static struct option long_options[] = 3935796c8dcSSimon Schubert { 3945796c8dcSSimon Schubert {"tui", no_argument, 0, OPT_TUI}, 3955796c8dcSSimon Schubert {"xdb", no_argument, &xdb_commands, 1}, 3965796c8dcSSimon Schubert {"dbx", no_argument, &dbx_commands, 1}, 3975796c8dcSSimon Schubert {"readnow", no_argument, &readnow_symbol_files, 1}, 3985796c8dcSSimon Schubert {"r", no_argument, &readnow_symbol_files, 1}, 3995796c8dcSSimon Schubert {"quiet", no_argument, &quiet, 1}, 4005796c8dcSSimon Schubert {"q", no_argument, &quiet, 1}, 4015796c8dcSSimon Schubert {"silent", no_argument, &quiet, 1}, 4025796c8dcSSimon Schubert {"nx", no_argument, &inhibit_gdbinit, 1}, 4035796c8dcSSimon Schubert {"n", no_argument, &inhibit_gdbinit, 1}, 4045796c8dcSSimon Schubert {"batch-silent", no_argument, 0, 'B'}, 405cf7f2e2dSJohn Marino {"batch", no_argument, &batch_flag, 1}, 4065796c8dcSSimon Schubert {"epoch", no_argument, &epoch_interface, 1}, 4075796c8dcSSimon Schubert 408*c50c785cSJohn Marino /* This is a synonym for "--annotate=1". --annotate is now 409*c50c785cSJohn Marino preferred, but keep this here for a long time because people 410*c50c785cSJohn Marino will be running emacses which use --fullname. */ 4115796c8dcSSimon Schubert {"fullname", no_argument, 0, 'f'}, 4125796c8dcSSimon Schubert {"f", no_argument, 0, 'f'}, 4135796c8dcSSimon Schubert 4145796c8dcSSimon Schubert {"annotate", required_argument, 0, OPT_ANNOTATE}, 4155796c8dcSSimon Schubert {"help", no_argument, &print_help, 1}, 4165796c8dcSSimon Schubert {"se", required_argument, 0, OPT_SE}, 4175796c8dcSSimon Schubert {"symbols", required_argument, 0, 's'}, 4185796c8dcSSimon Schubert {"s", required_argument, 0, 's'}, 4195796c8dcSSimon Schubert {"exec", required_argument, 0, 'e'}, 4205796c8dcSSimon Schubert {"e", required_argument, 0, 'e'}, 4215796c8dcSSimon Schubert {"core", required_argument, 0, 'c'}, 4225796c8dcSSimon Schubert {"c", required_argument, 0, 'c'}, 4235796c8dcSSimon Schubert {"pid", required_argument, 0, 'p'}, 4245796c8dcSSimon Schubert {"p", required_argument, 0, 'p'}, 4255796c8dcSSimon Schubert {"command", required_argument, 0, 'x'}, 4265796c8dcSSimon Schubert {"eval-command", required_argument, 0, 'X'}, 4275796c8dcSSimon Schubert {"version", no_argument, &print_version, 1}, 4285796c8dcSSimon Schubert {"x", required_argument, 0, 'x'}, 4295796c8dcSSimon Schubert {"ex", required_argument, 0, 'X'}, 4305796c8dcSSimon Schubert #ifdef GDBTK 4315796c8dcSSimon Schubert {"tclcommand", required_argument, 0, 'z'}, 4325796c8dcSSimon Schubert {"enable-external-editor", no_argument, 0, 'y'}, 4335796c8dcSSimon Schubert {"editor-command", required_argument, 0, 'w'}, 4345796c8dcSSimon Schubert #endif 4355796c8dcSSimon Schubert {"ui", required_argument, 0, 'i'}, 4365796c8dcSSimon Schubert {"interpreter", required_argument, 0, 'i'}, 4375796c8dcSSimon Schubert {"i", required_argument, 0, 'i'}, 4385796c8dcSSimon Schubert {"directory", required_argument, 0, 'd'}, 4395796c8dcSSimon Schubert {"d", required_argument, 0, 'd'}, 440*c50c785cSJohn Marino {"data-directory", required_argument, 0, 'D'}, 4415796c8dcSSimon Schubert {"cd", required_argument, 0, OPT_CD}, 4425796c8dcSSimon Schubert {"tty", required_argument, 0, 't'}, 4435796c8dcSSimon Schubert {"baud", required_argument, 0, 'b'}, 4445796c8dcSSimon Schubert {"b", required_argument, 0, 'b'}, 4455796c8dcSSimon Schubert {"nw", no_argument, NULL, OPT_NOWINDOWS}, 4465796c8dcSSimon Schubert {"nowindows", no_argument, NULL, OPT_NOWINDOWS}, 4475796c8dcSSimon Schubert {"w", no_argument, NULL, OPT_WINDOWS}, 4485796c8dcSSimon Schubert {"windows", no_argument, NULL, OPT_WINDOWS}, 4495796c8dcSSimon Schubert {"statistics", no_argument, 0, OPT_STATISTICS}, 4505796c8dcSSimon Schubert {"write", no_argument, &write_files, 1}, 4515796c8dcSSimon Schubert {"args", no_argument, &set_args, 1}, 4525796c8dcSSimon Schubert {"l", required_argument, 0, 'l'}, 4535796c8dcSSimon Schubert {"return-child-result", no_argument, &return_child_result, 1}, 4545796c8dcSSimon Schubert {0, no_argument, 0, 0} 4555796c8dcSSimon Schubert }; 4565796c8dcSSimon Schubert 4575796c8dcSSimon Schubert while (1) 4585796c8dcSSimon Schubert { 4595796c8dcSSimon Schubert int option_index; 4605796c8dcSSimon Schubert 4615796c8dcSSimon Schubert c = getopt_long_only (argc, argv, "", 4625796c8dcSSimon Schubert long_options, &option_index); 4635796c8dcSSimon Schubert if (c == EOF || set_args) 4645796c8dcSSimon Schubert break; 4655796c8dcSSimon Schubert 4665796c8dcSSimon Schubert /* Long option that takes an argument. */ 4675796c8dcSSimon Schubert if (c == 0 && long_options[option_index].flag == 0) 4685796c8dcSSimon Schubert c = long_options[option_index].val; 4695796c8dcSSimon Schubert 4705796c8dcSSimon Schubert switch (c) 4715796c8dcSSimon Schubert { 4725796c8dcSSimon Schubert case 0: 4735796c8dcSSimon Schubert /* Long option that just sets a flag. */ 4745796c8dcSSimon Schubert break; 4755796c8dcSSimon Schubert case OPT_SE: 4765796c8dcSSimon Schubert symarg = optarg; 4775796c8dcSSimon Schubert execarg = optarg; 4785796c8dcSSimon Schubert break; 4795796c8dcSSimon Schubert case OPT_CD: 4805796c8dcSSimon Schubert cdarg = optarg; 4815796c8dcSSimon Schubert break; 4825796c8dcSSimon Schubert case OPT_ANNOTATE: 4835796c8dcSSimon Schubert /* FIXME: what if the syntax is wrong (e.g. not digits)? */ 4845796c8dcSSimon Schubert annotation_level = atoi (optarg); 4855796c8dcSSimon Schubert break; 4865796c8dcSSimon Schubert case OPT_STATISTICS: 4875796c8dcSSimon Schubert /* Enable the display of both time and space usage. */ 488cf7f2e2dSJohn Marino set_display_time (1); 489cf7f2e2dSJohn Marino set_display_space (1); 4905796c8dcSSimon Schubert break; 4915796c8dcSSimon Schubert case OPT_TUI: 4925796c8dcSSimon Schubert /* --tui is equivalent to -i=tui. */ 4935796c8dcSSimon Schubert #ifdef TUI 4945796c8dcSSimon Schubert xfree (interpreter_p); 4955796c8dcSSimon Schubert interpreter_p = xstrdup (INTERP_TUI); 4965796c8dcSSimon Schubert #else 4975796c8dcSSimon Schubert fprintf_unfiltered (gdb_stderr, 4985796c8dcSSimon Schubert _("%s: TUI mode is not supported\n"), 4995796c8dcSSimon Schubert argv[0]); 5005796c8dcSSimon Schubert exit (1); 5015796c8dcSSimon Schubert #endif 5025796c8dcSSimon Schubert break; 5035796c8dcSSimon Schubert case OPT_WINDOWS: 5045796c8dcSSimon Schubert /* FIXME: cagney/2003-03-01: Not sure if this option is 5055796c8dcSSimon Schubert actually useful, and if it is, what it should do. */ 5065796c8dcSSimon Schubert #ifdef GDBTK 5075796c8dcSSimon Schubert /* --windows is equivalent to -i=insight. */ 5085796c8dcSSimon Schubert xfree (interpreter_p); 5095796c8dcSSimon Schubert interpreter_p = xstrdup (INTERP_INSIGHT); 5105796c8dcSSimon Schubert #endif 5115796c8dcSSimon Schubert use_windows = 1; 5125796c8dcSSimon Schubert break; 5135796c8dcSSimon Schubert case OPT_NOWINDOWS: 5145796c8dcSSimon Schubert /* -nw is equivalent to -i=console. */ 5155796c8dcSSimon Schubert xfree (interpreter_p); 5165796c8dcSSimon Schubert interpreter_p = xstrdup (INTERP_CONSOLE); 5175796c8dcSSimon Schubert use_windows = 0; 5185796c8dcSSimon Schubert break; 5195796c8dcSSimon Schubert case 'f': 5205796c8dcSSimon Schubert annotation_level = 1; 521*c50c785cSJohn Marino /* We have probably been invoked from emacs. Disable 522*c50c785cSJohn Marino window interface. */ 5235796c8dcSSimon Schubert use_windows = 0; 5245796c8dcSSimon Schubert break; 5255796c8dcSSimon Schubert case 's': 5265796c8dcSSimon Schubert symarg = optarg; 5275796c8dcSSimon Schubert break; 5285796c8dcSSimon Schubert case 'e': 5295796c8dcSSimon Schubert execarg = optarg; 5305796c8dcSSimon Schubert break; 5315796c8dcSSimon Schubert case 'c': 5325796c8dcSSimon Schubert corearg = optarg; 5335796c8dcSSimon Schubert break; 5345796c8dcSSimon Schubert case 'p': 5355796c8dcSSimon Schubert pidarg = optarg; 5365796c8dcSSimon Schubert break; 5375796c8dcSSimon Schubert case 'x': 5385796c8dcSSimon Schubert cmdarg[ncmd].type = CMDARG_FILE; 5395796c8dcSSimon Schubert cmdarg[ncmd++].string = optarg; 5405796c8dcSSimon Schubert if (ncmd >= cmdsize) 5415796c8dcSSimon Schubert { 5425796c8dcSSimon Schubert cmdsize *= 2; 5435796c8dcSSimon Schubert cmdarg = xrealloc ((char *) cmdarg, 5445796c8dcSSimon Schubert cmdsize * sizeof (*cmdarg)); 5455796c8dcSSimon Schubert } 5465796c8dcSSimon Schubert break; 5475796c8dcSSimon Schubert case 'X': 5485796c8dcSSimon Schubert cmdarg[ncmd].type = CMDARG_COMMAND; 5495796c8dcSSimon Schubert cmdarg[ncmd++].string = optarg; 5505796c8dcSSimon Schubert if (ncmd >= cmdsize) 5515796c8dcSSimon Schubert { 5525796c8dcSSimon Schubert cmdsize *= 2; 5535796c8dcSSimon Schubert cmdarg = xrealloc ((char *) cmdarg, 5545796c8dcSSimon Schubert cmdsize * sizeof (*cmdarg)); 5555796c8dcSSimon Schubert } 5565796c8dcSSimon Schubert break; 5575796c8dcSSimon Schubert case 'B': 558cf7f2e2dSJohn Marino batch_flag = batch_silent = 1; 5595796c8dcSSimon Schubert gdb_stdout = ui_file_new(); 5605796c8dcSSimon Schubert break; 561*c50c785cSJohn Marino case 'D': 562*c50c785cSJohn Marino xfree (gdb_datadir); 563*c50c785cSJohn Marino gdb_datadir = xstrdup (optarg); 564*c50c785cSJohn Marino break; 5655796c8dcSSimon Schubert #ifdef GDBTK 5665796c8dcSSimon Schubert case 'z': 5675796c8dcSSimon Schubert { 5685796c8dcSSimon Schubert extern int gdbtk_test (char *); 569*c50c785cSJohn Marino 5705796c8dcSSimon Schubert if (!gdbtk_test (optarg)) 5715796c8dcSSimon Schubert { 572*c50c785cSJohn Marino fprintf_unfiltered (gdb_stderr, 573*c50c785cSJohn Marino _("%s: unable to load " 574*c50c785cSJohn Marino "tclcommand file \"%s\""), 5755796c8dcSSimon Schubert argv[0], optarg); 5765796c8dcSSimon Schubert exit (1); 5775796c8dcSSimon Schubert } 5785796c8dcSSimon Schubert break; 5795796c8dcSSimon Schubert } 5805796c8dcSSimon Schubert case 'y': 5815796c8dcSSimon Schubert /* Backwards compatibility only. */ 5825796c8dcSSimon Schubert break; 5835796c8dcSSimon Schubert case 'w': 5845796c8dcSSimon Schubert { 5855796c8dcSSimon Schubert external_editor_command = xstrdup (optarg); 5865796c8dcSSimon Schubert break; 5875796c8dcSSimon Schubert } 5885796c8dcSSimon Schubert #endif /* GDBTK */ 5895796c8dcSSimon Schubert case 'i': 5905796c8dcSSimon Schubert xfree (interpreter_p); 5915796c8dcSSimon Schubert interpreter_p = xstrdup (optarg); 5925796c8dcSSimon Schubert break; 5935796c8dcSSimon Schubert case 'd': 5945796c8dcSSimon Schubert dirarg[ndir++] = optarg; 5955796c8dcSSimon Schubert if (ndir >= dirsize) 5965796c8dcSSimon Schubert { 5975796c8dcSSimon Schubert dirsize *= 2; 5985796c8dcSSimon Schubert dirarg = (char **) xrealloc ((char *) dirarg, 5995796c8dcSSimon Schubert dirsize * sizeof (*dirarg)); 6005796c8dcSSimon Schubert } 6015796c8dcSSimon Schubert break; 6025796c8dcSSimon Schubert case 't': 6035796c8dcSSimon Schubert ttyarg = optarg; 6045796c8dcSSimon Schubert break; 6055796c8dcSSimon Schubert case 'q': 6065796c8dcSSimon Schubert quiet = 1; 6075796c8dcSSimon Schubert break; 6085796c8dcSSimon Schubert case 'b': 6095796c8dcSSimon Schubert { 6105796c8dcSSimon Schubert int i; 6115796c8dcSSimon Schubert char *p; 6125796c8dcSSimon Schubert 6135796c8dcSSimon Schubert i = strtol (optarg, &p, 0); 6145796c8dcSSimon Schubert if (i == 0 && p == optarg) 6155796c8dcSSimon Schubert 6165796c8dcSSimon Schubert /* Don't use *_filtered or warning() (which relies on 6175796c8dcSSimon Schubert current_target) until after initialize_all_files(). */ 6185796c8dcSSimon Schubert 6195796c8dcSSimon Schubert fprintf_unfiltered 6205796c8dcSSimon Schubert (gdb_stderr, 6215796c8dcSSimon Schubert _("warning: could not set baud rate to `%s'.\n"), optarg); 6225796c8dcSSimon Schubert else 6235796c8dcSSimon Schubert baud_rate = i; 6245796c8dcSSimon Schubert } 6255796c8dcSSimon Schubert break; 6265796c8dcSSimon Schubert case 'l': 6275796c8dcSSimon Schubert { 6285796c8dcSSimon Schubert int i; 6295796c8dcSSimon Schubert char *p; 6305796c8dcSSimon Schubert 6315796c8dcSSimon Schubert i = strtol (optarg, &p, 0); 6325796c8dcSSimon Schubert if (i == 0 && p == optarg) 6335796c8dcSSimon Schubert 6345796c8dcSSimon Schubert /* Don't use *_filtered or warning() (which relies on 6355796c8dcSSimon Schubert current_target) until after initialize_all_files(). */ 6365796c8dcSSimon Schubert 637*c50c785cSJohn Marino fprintf_unfiltered (gdb_stderr, 638*c50c785cSJohn Marino _("warning: could not set " 639*c50c785cSJohn Marino "timeout limit to `%s'.\n"), optarg); 6405796c8dcSSimon Schubert else 6415796c8dcSSimon Schubert remote_timeout = i; 6425796c8dcSSimon Schubert } 6435796c8dcSSimon Schubert break; 6445796c8dcSSimon Schubert 6455796c8dcSSimon Schubert case '?': 6465796c8dcSSimon Schubert fprintf_unfiltered (gdb_stderr, 647*c50c785cSJohn Marino _("Use `%s --help' for a " 648*c50c785cSJohn Marino "complete list of options.\n"), 6495796c8dcSSimon Schubert argv[0]); 6505796c8dcSSimon Schubert exit (1); 6515796c8dcSSimon Schubert } 6525796c8dcSSimon Schubert } 6535796c8dcSSimon Schubert 6545796c8dcSSimon Schubert /* If --help or --version, disable window interface. */ 6555796c8dcSSimon Schubert if (print_help || print_version) 6565796c8dcSSimon Schubert { 6575796c8dcSSimon Schubert use_windows = 0; 6585796c8dcSSimon Schubert } 6595796c8dcSSimon Schubert 660cf7f2e2dSJohn Marino if (batch_flag) 661cf7f2e2dSJohn Marino quiet = 1; 662cf7f2e2dSJohn Marino } 663cf7f2e2dSJohn Marino 664cf7f2e2dSJohn Marino /* Initialize all files. Give the interpreter a chance to take 665cf7f2e2dSJohn Marino control of the console via the deprecated_init_ui_hook (). */ 666cf7f2e2dSJohn Marino gdb_init (argv[0]); 667cf7f2e2dSJohn Marino 668*c50c785cSJohn Marino /* Now that gdb_init has created the initial inferior, we're in 669*c50c785cSJohn Marino position to set args for that inferior. */ 6705796c8dcSSimon Schubert if (set_args) 6715796c8dcSSimon Schubert { 6725796c8dcSSimon Schubert /* The remaining options are the command-line options for the 6735796c8dcSSimon Schubert inferior. The first one is the sym/exec file, and the rest 6745796c8dcSSimon Schubert are arguments. */ 6755796c8dcSSimon Schubert if (optind >= argc) 6765796c8dcSSimon Schubert { 6775796c8dcSSimon Schubert fprintf_unfiltered (gdb_stderr, 678*c50c785cSJohn Marino _("%s: `--args' specified but " 679*c50c785cSJohn Marino "no program specified\n"), 6805796c8dcSSimon Schubert argv[0]); 6815796c8dcSSimon Schubert exit (1); 6825796c8dcSSimon Schubert } 6835796c8dcSSimon Schubert symarg = argv[optind]; 6845796c8dcSSimon Schubert execarg = argv[optind]; 6855796c8dcSSimon Schubert ++optind; 6865796c8dcSSimon Schubert set_inferior_args_vector (argc - optind, &argv[optind]); 6875796c8dcSSimon Schubert } 6885796c8dcSSimon Schubert else 6895796c8dcSSimon Schubert { 6905796c8dcSSimon Schubert /* OK, that's all the options. */ 6915796c8dcSSimon Schubert 6925796c8dcSSimon Schubert /* The first argument, if specified, is the name of the 6935796c8dcSSimon Schubert executable. */ 6945796c8dcSSimon Schubert if (optind < argc) 6955796c8dcSSimon Schubert { 6965796c8dcSSimon Schubert symarg = argv[optind]; 6975796c8dcSSimon Schubert execarg = argv[optind]; 6985796c8dcSSimon Schubert optind++; 6995796c8dcSSimon Schubert } 7005796c8dcSSimon Schubert 7015796c8dcSSimon Schubert /* If the user hasn't already specified a PID or the name of a 7025796c8dcSSimon Schubert core file, then a second optional argument is allowed. If 7035796c8dcSSimon Schubert present, this argument should be interpreted as either a 7045796c8dcSSimon Schubert PID or a core file, whichever works. */ 7055796c8dcSSimon Schubert if (pidarg == NULL && corearg == NULL && optind < argc) 7065796c8dcSSimon Schubert { 7075796c8dcSSimon Schubert pid_or_core_arg = argv[optind]; 7085796c8dcSSimon Schubert optind++; 7095796c8dcSSimon Schubert } 7105796c8dcSSimon Schubert 7115796c8dcSSimon Schubert /* Any argument left on the command line is unexpected and 7125796c8dcSSimon Schubert will be ignored. Inform the user. */ 7135796c8dcSSimon Schubert if (optind < argc) 714*c50c785cSJohn Marino fprintf_unfiltered (gdb_stderr, 715*c50c785cSJohn Marino _("Excess command line " 716*c50c785cSJohn Marino "arguments ignored. (%s%s)\n"), 7175796c8dcSSimon Schubert argv[optind], 7185796c8dcSSimon Schubert (optind == argc - 1) ? "" : " ..."); 7195796c8dcSSimon Schubert } 7205796c8dcSSimon Schubert 721*c50c785cSJohn Marino /* Lookup gdbinit files. Note that the gdbinit file name may be 722*c50c785cSJohn Marino overriden during file initialization, so get_init_files should be 723*c50c785cSJohn Marino called after gdb_init. */ 7245796c8dcSSimon Schubert get_init_files (&system_gdbinit, &home_gdbinit, &local_gdbinit); 7255796c8dcSSimon Schubert 7265796c8dcSSimon Schubert /* Do these (and anything which might call wrap_here or *_filtered) 7275796c8dcSSimon Schubert after initialize_all_files() but before the interpreter has been 7285796c8dcSSimon Schubert installed. Otherwize the help/version messages will be eaten by 7295796c8dcSSimon Schubert the interpreter's output handler. */ 7305796c8dcSSimon Schubert 7315796c8dcSSimon Schubert if (print_version) 7325796c8dcSSimon Schubert { 7335796c8dcSSimon Schubert print_gdb_version (gdb_stdout); 7345796c8dcSSimon Schubert wrap_here (""); 7355796c8dcSSimon Schubert printf_filtered ("\n"); 7365796c8dcSSimon Schubert exit (0); 7375796c8dcSSimon Schubert } 7385796c8dcSSimon Schubert 7395796c8dcSSimon Schubert if (print_help) 7405796c8dcSSimon Schubert { 7415796c8dcSSimon Schubert print_gdb_help (gdb_stdout); 7425796c8dcSSimon Schubert fputs_unfiltered ("\n", gdb_stdout); 7435796c8dcSSimon Schubert exit (0); 7445796c8dcSSimon Schubert } 7455796c8dcSSimon Schubert 7465796c8dcSSimon Schubert /* FIXME: cagney/2003-02-03: The big hack (part 1 of 2) that lets 7475796c8dcSSimon Schubert GDB retain the old MI1 interpreter startup behavior. Output the 7485796c8dcSSimon Schubert copyright message before the interpreter is installed. That way 7495796c8dcSSimon Schubert it isn't encapsulated in MI output. */ 7505796c8dcSSimon Schubert if (!quiet && strcmp (interpreter_p, INTERP_MI1) == 0) 7515796c8dcSSimon Schubert { 752*c50c785cSJohn Marino /* Print all the junk at the top, with trailing "..." if we are 753*c50c785cSJohn Marino about to read a symbol file (possibly slowly). */ 7545796c8dcSSimon Schubert print_gdb_version (gdb_stdout); 7555796c8dcSSimon Schubert if (symarg) 7565796c8dcSSimon Schubert printf_filtered (".."); 7575796c8dcSSimon Schubert wrap_here (""); 7585796c8dcSSimon Schubert printf_filtered ("\n"); 759*c50c785cSJohn Marino gdb_flush (gdb_stdout); /* Force to screen during slow 760*c50c785cSJohn Marino operations. */ 7615796c8dcSSimon Schubert } 7625796c8dcSSimon Schubert 7635796c8dcSSimon Schubert /* Install the default UI. All the interpreters should have had a 7645796c8dcSSimon Schubert look at things by now. Initialize the default interpreter. */ 7655796c8dcSSimon Schubert 7665796c8dcSSimon Schubert { 7675796c8dcSSimon Schubert /* Find it. */ 7685796c8dcSSimon Schubert struct interp *interp = interp_lookup (interpreter_p); 769cf7f2e2dSJohn Marino 7705796c8dcSSimon Schubert if (interp == NULL) 7715796c8dcSSimon Schubert error (_("Interpreter `%s' unrecognized"), interpreter_p); 7725796c8dcSSimon Schubert /* Install it. */ 7735796c8dcSSimon Schubert if (!interp_set (interp, 1)) 7745796c8dcSSimon Schubert { 7755796c8dcSSimon Schubert fprintf_unfiltered (gdb_stderr, 7765796c8dcSSimon Schubert "Interpreter `%s' failed to initialize.\n", 7775796c8dcSSimon Schubert interpreter_p); 7785796c8dcSSimon Schubert exit (1); 7795796c8dcSSimon Schubert } 7805796c8dcSSimon Schubert } 7815796c8dcSSimon Schubert 7825796c8dcSSimon Schubert /* FIXME: cagney/2003-02-03: The big hack (part 2 of 2) that lets 7835796c8dcSSimon Schubert GDB retain the old MI1 interpreter startup behavior. Output the 7845796c8dcSSimon Schubert copyright message after the interpreter is installed when it is 7855796c8dcSSimon Schubert any sane interpreter. */ 7865796c8dcSSimon Schubert if (!quiet && !current_interp_named_p (INTERP_MI1)) 7875796c8dcSSimon Schubert { 788*c50c785cSJohn Marino /* Print all the junk at the top, with trailing "..." if we are 789*c50c785cSJohn Marino about to read a symbol file (possibly slowly). */ 7905796c8dcSSimon Schubert print_gdb_version (gdb_stdout); 7915796c8dcSSimon Schubert if (symarg) 7925796c8dcSSimon Schubert printf_filtered (".."); 7935796c8dcSSimon Schubert wrap_here (""); 7945796c8dcSSimon Schubert printf_filtered ("\n"); 795*c50c785cSJohn Marino gdb_flush (gdb_stdout); /* Force to screen during slow 796*c50c785cSJohn Marino operations. */ 7975796c8dcSSimon Schubert } 7985796c8dcSSimon Schubert 7995796c8dcSSimon Schubert /* Set off error and warning messages with a blank line. */ 8005796c8dcSSimon Schubert error_pre_print = "\n"; 8015796c8dcSSimon Schubert quit_pre_print = error_pre_print; 8025796c8dcSSimon Schubert warning_pre_print = _("\nwarning: "); 8035796c8dcSSimon Schubert 8045796c8dcSSimon Schubert /* Read and execute the system-wide gdbinit file, if it exists. 8055796c8dcSSimon Schubert This is done *before* all the command line arguments are 8065796c8dcSSimon Schubert processed; it sets global parameters, which are independent of 8075796c8dcSSimon Schubert what file you are debugging or what directory you are in. */ 8085796c8dcSSimon Schubert if (system_gdbinit && !inhibit_gdbinit) 8095796c8dcSSimon Schubert catch_command_errors (source_script, system_gdbinit, 0, RETURN_MASK_ALL); 8105796c8dcSSimon Schubert 8115796c8dcSSimon Schubert /* Read and execute $HOME/.gdbinit file, if it exists. This is done 8125796c8dcSSimon Schubert *before* all the command line arguments are processed; it sets 8135796c8dcSSimon Schubert global parameters, which are independent of what file you are 8145796c8dcSSimon Schubert debugging or what directory you are in. */ 8155796c8dcSSimon Schubert 8165796c8dcSSimon Schubert if (home_gdbinit && !inhibit_gdbinit) 8175796c8dcSSimon Schubert catch_command_errors (source_script, home_gdbinit, 0, RETURN_MASK_ALL); 8185796c8dcSSimon Schubert 8195796c8dcSSimon Schubert /* Now perform all the actions indicated by the arguments. */ 8205796c8dcSSimon Schubert if (cdarg != NULL) 8215796c8dcSSimon Schubert { 8225796c8dcSSimon Schubert catch_command_errors (cd_command, cdarg, 0, RETURN_MASK_ALL); 8235796c8dcSSimon Schubert } 8245796c8dcSSimon Schubert 8255796c8dcSSimon Schubert for (i = 0; i < ndir; i++) 8265796c8dcSSimon Schubert catch_command_errors (directory_switch, dirarg[i], 0, RETURN_MASK_ALL); 8275796c8dcSSimon Schubert xfree (dirarg); 8285796c8dcSSimon Schubert 829cf7f2e2dSJohn Marino /* Skip auto-loading section-specified scripts until we've sourced 830*c50c785cSJohn Marino local_gdbinit (which is often used to augment the source search 831*c50c785cSJohn Marino path). */ 832cf7f2e2dSJohn Marino save_auto_load = gdbpy_global_auto_load; 833cf7f2e2dSJohn Marino gdbpy_global_auto_load = 0; 834cf7f2e2dSJohn Marino 8355796c8dcSSimon Schubert if (execarg != NULL 8365796c8dcSSimon Schubert && symarg != NULL 8375796c8dcSSimon Schubert && strcmp (execarg, symarg) == 0) 8385796c8dcSSimon Schubert { 8395796c8dcSSimon Schubert /* The exec file and the symbol-file are the same. If we can't 8405796c8dcSSimon Schubert open it, better only print one error message. 8415796c8dcSSimon Schubert catch_command_errors returns non-zero on success! */ 842*c50c785cSJohn Marino if (catch_command_errors (exec_file_attach, execarg, 843*c50c785cSJohn Marino !batch_flag, RETURN_MASK_ALL)) 844*c50c785cSJohn Marino catch_command_errors (symbol_file_add_main, symarg, 845*c50c785cSJohn Marino !batch_flag, RETURN_MASK_ALL); 8465796c8dcSSimon Schubert } 8475796c8dcSSimon Schubert else 8485796c8dcSSimon Schubert { 8495796c8dcSSimon Schubert if (execarg != NULL) 850*c50c785cSJohn Marino catch_command_errors (exec_file_attach, execarg, 851*c50c785cSJohn Marino !batch_flag, RETURN_MASK_ALL); 8525796c8dcSSimon Schubert if (symarg != NULL) 853*c50c785cSJohn Marino catch_command_errors (symbol_file_add_main, symarg, 854*c50c785cSJohn Marino !batch_flag, RETURN_MASK_ALL); 8555796c8dcSSimon Schubert } 8565796c8dcSSimon Schubert 8575796c8dcSSimon Schubert if (corearg && pidarg) 858*c50c785cSJohn Marino error (_("Can't attach to process and specify " 859*c50c785cSJohn Marino "a core file at the same time.")); 8605796c8dcSSimon Schubert 8615796c8dcSSimon Schubert if (corearg != NULL) 8625796c8dcSSimon Schubert catch_command_errors (core_file_command, corearg, 863cf7f2e2dSJohn Marino !batch_flag, RETURN_MASK_ALL); 8645796c8dcSSimon Schubert else if (pidarg != NULL) 8655796c8dcSSimon Schubert catch_command_errors (attach_command, pidarg, 866cf7f2e2dSJohn Marino !batch_flag, RETURN_MASK_ALL); 8675796c8dcSSimon Schubert else if (pid_or_core_arg) 8685796c8dcSSimon Schubert { 8695796c8dcSSimon Schubert /* The user specified 'gdb program pid' or gdb program core'. 8705796c8dcSSimon Schubert If pid_or_core_arg's first character is a digit, try attach 8715796c8dcSSimon Schubert first and then corefile. Otherwise try just corefile. */ 8725796c8dcSSimon Schubert 8735796c8dcSSimon Schubert if (isdigit (pid_or_core_arg[0])) 8745796c8dcSSimon Schubert { 8755796c8dcSSimon Schubert if (catch_command_errors (attach_command, pid_or_core_arg, 876cf7f2e2dSJohn Marino !batch_flag, RETURN_MASK_ALL) == 0) 8775796c8dcSSimon Schubert catch_command_errors (core_file_command, pid_or_core_arg, 878cf7f2e2dSJohn Marino !batch_flag, RETURN_MASK_ALL); 8795796c8dcSSimon Schubert } 8805796c8dcSSimon Schubert else /* Can't be a pid, better be a corefile. */ 8815796c8dcSSimon Schubert catch_command_errors (core_file_command, pid_or_core_arg, 882cf7f2e2dSJohn Marino !batch_flag, RETURN_MASK_ALL); 8835796c8dcSSimon Schubert } 8845796c8dcSSimon Schubert 8855796c8dcSSimon Schubert if (ttyarg != NULL) 886cf7f2e2dSJohn Marino set_inferior_io_terminal (ttyarg); 8875796c8dcSSimon Schubert 8885796c8dcSSimon Schubert /* Error messages should no longer be distinguished with extra output. */ 8895796c8dcSSimon Schubert error_pre_print = NULL; 8905796c8dcSSimon Schubert quit_pre_print = NULL; 8915796c8dcSSimon Schubert warning_pre_print = _("warning: "); 8925796c8dcSSimon Schubert 8935796c8dcSSimon Schubert /* Read the .gdbinit file in the current directory, *if* it isn't 8945796c8dcSSimon Schubert the same as the $HOME/.gdbinit file (it should exist, also). */ 8955796c8dcSSimon Schubert if (local_gdbinit && !inhibit_gdbinit) 8965796c8dcSSimon Schubert catch_command_errors (source_script, local_gdbinit, 0, RETURN_MASK_ALL); 8975796c8dcSSimon Schubert 898cf7f2e2dSJohn Marino /* Now that all .gdbinit's have been read and all -d options have been 899cf7f2e2dSJohn Marino processed, we can read any scripts mentioned in SYMARG. 900cf7f2e2dSJohn Marino We wait until now because it is common to add to the source search 901cf7f2e2dSJohn Marino path in local_gdbinit. */ 902cf7f2e2dSJohn Marino gdbpy_global_auto_load = save_auto_load; 903*c50c785cSJohn Marino ALL_OBJFILES (objfile) 904*c50c785cSJohn Marino load_auto_scripts_for_objfile (objfile); 905cf7f2e2dSJohn Marino 9065796c8dcSSimon Schubert for (i = 0; i < ncmd; i++) 9075796c8dcSSimon Schubert { 9085796c8dcSSimon Schubert if (cmdarg[i].type == CMDARG_FILE) 9095796c8dcSSimon Schubert catch_command_errors (source_script, cmdarg[i].string, 910cf7f2e2dSJohn Marino !batch_flag, RETURN_MASK_ALL); 9115796c8dcSSimon Schubert else /* cmdarg[i].type == CMDARG_COMMAND */ 9125796c8dcSSimon Schubert catch_command_errors (execute_command, cmdarg[i].string, 913cf7f2e2dSJohn Marino !batch_flag, RETURN_MASK_ALL); 9145796c8dcSSimon Schubert } 9155796c8dcSSimon Schubert xfree (cmdarg); 9165796c8dcSSimon Schubert 917*c50c785cSJohn Marino /* Read in the old history after all the command files have been 918*c50c785cSJohn Marino read. */ 9195796c8dcSSimon Schubert init_history (); 9205796c8dcSSimon Schubert 921cf7f2e2dSJohn Marino if (batch_flag) 9225796c8dcSSimon Schubert { 9235796c8dcSSimon Schubert /* We have hit the end of the batch file. */ 9245796c8dcSSimon Schubert quit_force (NULL, 0); 9255796c8dcSSimon Schubert } 9265796c8dcSSimon Schubert 9275796c8dcSSimon Schubert /* Show time and/or space usage. */ 928cf7f2e2dSJohn Marino do_cleanups (pre_stat_chain); 9295796c8dcSSimon Schubert 9305796c8dcSSimon Schubert /* NOTE: cagney/1999-11-07: There is probably no reason for not 9315796c8dcSSimon Schubert moving this loop and the code found in captured_command_loop() 9325796c8dcSSimon Schubert into the command_loop() proper. The main thing holding back that 9335796c8dcSSimon Schubert change - SET_TOP_LEVEL() - has been eliminated. */ 9345796c8dcSSimon Schubert while (1) 9355796c8dcSSimon Schubert { 9365796c8dcSSimon Schubert catch_errors (captured_command_loop, 0, "", RETURN_MASK_ALL); 9375796c8dcSSimon Schubert } 9385796c8dcSSimon Schubert /* No exit -- exit is through quit_command. */ 9395796c8dcSSimon Schubert } 9405796c8dcSSimon Schubert 9415796c8dcSSimon Schubert int 9425796c8dcSSimon Schubert gdb_main (struct captured_main_args *args) 9435796c8dcSSimon Schubert { 9445796c8dcSSimon Schubert use_windows = args->use_windows; 9455796c8dcSSimon Schubert catch_errors (captured_main, args, "", RETURN_MASK_ALL); 9465796c8dcSSimon Schubert /* The only way to end up here is by an error (normal exit is 9475796c8dcSSimon Schubert handled by quit_force()), hence always return an error status. */ 9485796c8dcSSimon Schubert return 1; 9495796c8dcSSimon Schubert } 9505796c8dcSSimon Schubert 9515796c8dcSSimon Schubert 9525796c8dcSSimon Schubert /* Don't use *_filtered for printing help. We don't want to prompt 9535796c8dcSSimon Schubert for continue no matter how small the screen or how much we're going 9545796c8dcSSimon Schubert to print. */ 9555796c8dcSSimon Schubert 9565796c8dcSSimon Schubert static void 9575796c8dcSSimon Schubert print_gdb_help (struct ui_file *stream) 9585796c8dcSSimon Schubert { 9595796c8dcSSimon Schubert char *system_gdbinit; 9605796c8dcSSimon Schubert char *home_gdbinit; 9615796c8dcSSimon Schubert char *local_gdbinit; 9625796c8dcSSimon Schubert 9635796c8dcSSimon Schubert get_init_files (&system_gdbinit, &home_gdbinit, &local_gdbinit); 9645796c8dcSSimon Schubert 9655796c8dcSSimon Schubert fputs_unfiltered (_("\ 9665796c8dcSSimon Schubert This is the GNU debugger. Usage:\n\n\ 9675796c8dcSSimon Schubert gdb [options] [executable-file [core-file or process-id]]\n\ 9685796c8dcSSimon Schubert gdb [options] --args executable-file [inferior-arguments ...]\n\n\ 9695796c8dcSSimon Schubert Options:\n\n\ 9705796c8dcSSimon Schubert "), stream); 9715796c8dcSSimon Schubert fputs_unfiltered (_("\ 9725796c8dcSSimon Schubert --args Arguments after executable-file are passed to inferior\n\ 9735796c8dcSSimon Schubert "), stream); 9745796c8dcSSimon Schubert fputs_unfiltered (_("\ 9755796c8dcSSimon Schubert -b BAUDRATE Set serial port baud rate used for remote debugging.\n\ 9765796c8dcSSimon Schubert --batch Exit after processing options.\n\ 9775796c8dcSSimon Schubert --batch-silent As for --batch, but suppress all gdb stdout output.\n\ 9785796c8dcSSimon Schubert --return-child-result\n\ 9795796c8dcSSimon Schubert GDB exit code will be the child's exit code.\n\ 9805796c8dcSSimon Schubert --cd=DIR Change current directory to DIR.\n\ 9815796c8dcSSimon Schubert --command=FILE, -x Execute GDB commands from FILE.\n\ 9825796c8dcSSimon Schubert --eval-command=COMMAND, -ex\n\ 9835796c8dcSSimon Schubert Execute a single GDB command.\n\ 9845796c8dcSSimon Schubert May be used multiple times and in conjunction\n\ 9855796c8dcSSimon Schubert with --command.\n\ 9865796c8dcSSimon Schubert --core=COREFILE Analyze the core dump COREFILE.\n\ 9875796c8dcSSimon Schubert --pid=PID Attach to running process PID.\n\ 9885796c8dcSSimon Schubert "), stream); 9895796c8dcSSimon Schubert fputs_unfiltered (_("\ 9905796c8dcSSimon Schubert --dbx DBX compatibility mode.\n\ 9915796c8dcSSimon Schubert --directory=DIR Search for source files in DIR.\n\ 9925796c8dcSSimon Schubert --epoch Output information used by epoch emacs-GDB interface.\n\ 9935796c8dcSSimon Schubert --exec=EXECFILE Use EXECFILE as the executable.\n\ 9945796c8dcSSimon Schubert --fullname Output information used by emacs-GDB interface.\n\ 9955796c8dcSSimon Schubert --help Print this message.\n\ 9965796c8dcSSimon Schubert "), stream); 9975796c8dcSSimon Schubert fputs_unfiltered (_("\ 9985796c8dcSSimon Schubert --interpreter=INTERP\n\ 9995796c8dcSSimon Schubert Select a specific interpreter / user interface\n\ 10005796c8dcSSimon Schubert "), stream); 10015796c8dcSSimon Schubert fputs_unfiltered (_("\ 10025796c8dcSSimon Schubert -l TIMEOUT Set timeout in seconds for remote debugging.\n\ 10035796c8dcSSimon Schubert --nw Do not use a window interface.\n\ 10045796c8dcSSimon Schubert --nx Do not read "), stream); 10055796c8dcSSimon Schubert fputs_unfiltered (gdbinit, stream); 10065796c8dcSSimon Schubert fputs_unfiltered (_(" file.\n\ 10075796c8dcSSimon Schubert --quiet Do not print version number on startup.\n\ 10085796c8dcSSimon Schubert --readnow Fully read symbol files on first access.\n\ 10095796c8dcSSimon Schubert "), stream); 10105796c8dcSSimon Schubert fputs_unfiltered (_("\ 10115796c8dcSSimon Schubert --se=FILE Use FILE as symbol file and executable file.\n\ 10125796c8dcSSimon Schubert --symbols=SYMFILE Read symbols from SYMFILE.\n\ 10135796c8dcSSimon Schubert --tty=TTY Use TTY for input/output by the program being debugged.\n\ 10145796c8dcSSimon Schubert "), stream); 10155796c8dcSSimon Schubert #if defined(TUI) 10165796c8dcSSimon Schubert fputs_unfiltered (_("\ 10175796c8dcSSimon Schubert --tui Use a terminal user interface.\n\ 10185796c8dcSSimon Schubert "), stream); 10195796c8dcSSimon Schubert #endif 10205796c8dcSSimon Schubert fputs_unfiltered (_("\ 10215796c8dcSSimon Schubert --version Print version information and then exit.\n\ 10225796c8dcSSimon Schubert -w Use a window interface.\n\ 10235796c8dcSSimon Schubert --write Set writing into executable and core files.\n\ 10245796c8dcSSimon Schubert --xdb XDB compatibility mode.\n\ 10255796c8dcSSimon Schubert "), stream); 10265796c8dcSSimon Schubert fputs_unfiltered (_("\n\ 10275796c8dcSSimon Schubert At startup, GDB reads the following init files and executes their commands:\n\ 10285796c8dcSSimon Schubert "), stream); 10295796c8dcSSimon Schubert if (system_gdbinit) 10305796c8dcSSimon Schubert fprintf_unfiltered (stream, _("\ 10315796c8dcSSimon Schubert * system-wide init file: %s\n\ 10325796c8dcSSimon Schubert "), system_gdbinit); 10335796c8dcSSimon Schubert if (home_gdbinit) 10345796c8dcSSimon Schubert fprintf_unfiltered (stream, _("\ 10355796c8dcSSimon Schubert * user-specific init file: %s\n\ 10365796c8dcSSimon Schubert "), home_gdbinit); 10375796c8dcSSimon Schubert if (local_gdbinit) 10385796c8dcSSimon Schubert fprintf_unfiltered (stream, _("\ 10395796c8dcSSimon Schubert * local init file: ./%s\n\ 10405796c8dcSSimon Schubert "), local_gdbinit); 10415796c8dcSSimon Schubert fputs_unfiltered (_("\n\ 10425796c8dcSSimon Schubert For more information, type \"help\" from within GDB, or consult the\n\ 10435796c8dcSSimon Schubert GDB manual (available as on-line info or a printed manual).\n\ 10445796c8dcSSimon Schubert "), stream); 10455796c8dcSSimon Schubert if (REPORT_BUGS_TO[0] && stream == gdb_stdout) 10465796c8dcSSimon Schubert fprintf_unfiltered (stream, _("\ 10475796c8dcSSimon Schubert Report bugs to \"%s\".\n\ 10485796c8dcSSimon Schubert "), REPORT_BUGS_TO); 10495796c8dcSSimon Schubert } 1050