diff options
Diffstat (limited to 'gdb/infcmd.c')
-rw-r--r-- | gdb/infcmd.c | 193 |
1 files changed, 124 insertions, 69 deletions
diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 086e1f3..254c961 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1,22 +1,21 @@ /* Memory-access and commands for inferior process, for GDB. - Copyright (C) 1986, 1987, 1988 Free Software Foundation, Inc. + Copyright (C) 1986, 1987, 1988, 1989 Free Software Foundation, Inc. -GDB is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY. No author or distributor accepts responsibility to anyone -for the consequences of using it or for whether it serves any -particular purpose or works at all, unless he says so in writing. -Refer to the GDB General Public License for full details. +This file is part of GDB. -Everyone is granted permission to copy, modify and redistribute GDB, -but only under the conditions described in the GDB General Public -License. A copy of this license is supposed to have been given to you -along with GDB so you can know your rights and responsibilities. It -should be in a file named COPYING. Among other things, the copyright -notice and this notice must be preserved on all copies. +GDB 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 1, or (at your option) +any later version. -In other words, go ahead and share GDB, but don't try to stop -anyone else from sharing it farther. Help stamp out software hoarding! -*/ +GDB 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 GDB; see the file COPYING. If not, write to +the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defs.h" #include "param.h" @@ -126,8 +125,9 @@ set_args_command (args) } void -tty_command (file) +tty_command (file, from_tty) char *file; + int from_tty; { if (file == 0) error_no_arg ("terminal name for running target process"); @@ -160,13 +160,13 @@ Start it from the beginning? ")) kill_inferior (); } + exec_file = (char *) get_exec_file (1); + if (remote_debugging) { - free (allargs); if (from_tty) { - printf ("Starting program: %s%s\n", - exec_file, inferior_args); + printf ("Starting program: %s\n", exec_file); fflush (stdout); } } @@ -175,7 +175,6 @@ Start it from the beginning? ")) if (args) set_args_command (args); - exec_file = (char *) get_exec_file (1); if (from_tty) { printf ("Starting program: %s%s\n", @@ -566,7 +565,7 @@ finish_command (arg, from_tty) value_type)); printf ("Value returned is $%d = ", record_latest_value (val)); - value_print (val, stdout, 0); + value_print (val, stdout, 0, Val_no_prettyprint); putchar ('\n'); } } @@ -674,11 +673,18 @@ set_environment_command (arg) } static void -unset_environment_command (var) +unset_environment_command (var, from_tty) char *var; + int from_tty; { if (var == 0) - error_no_arg ("environment variable"); + /* If there is no argument, delete all environment variables. + Ask for confirmation if reading from the terminal. */ + if (!from_tty || query ("Delete all environment variables? ")) + { + free_environ (inferior_environ); + inferior_environ = make_environ (); + } unset_in_environ (inferior_environ, var); } @@ -694,25 +700,48 @@ read_memory_integer (memaddr, len) short sbuf; int ibuf; long lbuf; + int result_err; + extern int sys_nerr; + extern char *sys_errlist[]; if (len == sizeof (char)) { - read_memory (memaddr, &cbuf, len); + result_err = read_memory (memaddr, &cbuf, len); + if (result_err) + error ("Error reading memory address 0x%x: %s (%d).", + memaddr, (result_err < sys_nerr ? + sys_errlist[result_err] : + "uknown error"), result_err); return cbuf; } if (len == sizeof (short)) { - read_memory (memaddr, &sbuf, len); + result_err = read_memory (memaddr, &sbuf, len); + if (result_err) + error ("Error reading memory address 0x%x: %s (%d).", + memaddr, (result_err < sys_nerr ? + sys_errlist[result_err] : + "uknown error"), result_err); return sbuf; } if (len == sizeof (int)) { - read_memory (memaddr, &ibuf, len); + result_err = read_memory (memaddr, &ibuf, len); + if (result_err) + error ("Error reading memory address 0x%x: %s (%d).", + memaddr, (result_err < sys_nerr ? + sys_errlist[result_err] : + "uknown error"), result_err); return ibuf; } if (len == sizeof (lbuf)) { - read_memory (memaddr, &lbuf, len); + result_err = read_memory (memaddr, &lbuf, len); + if (result_err) + error ("Error reading memory address 0x%x: %s (%d).", + memaddr, (result_err < sys_nerr ? + sys_errlist[result_err] : + "uknown error"), result_err); return lbuf; } error ("Cannot handle integers of %d bytes.", len); @@ -763,7 +792,8 @@ registers_info (addr_exp) } } else - printf ("Reg\tContents\n\n"); + printf_filtered ( + "Register Contents (relative to selected stack frame)\n\n"); for (i = 0; i < NUM_REGS; i++) { @@ -774,34 +804,26 @@ registers_info (addr_exp) if (addr_exp != 0 && i != regnum) continue; - /* On machines with lots of registers, pause every 16 lines - so user can read the output. */ - if (addr_exp == 0 && i > 0 && i % 16 == 0) - { - printf ("--Type Return to print more--"); - fflush (stdout); - gdb_read_line (0, 0); - } - /* Get the data in raw format, then convert also to virtual format. */ read_relative_register_raw_bytes (i, raw_buffer); REGISTER_CONVERT_TO_VIRTUAL (i, raw_buffer, virtual_buffer); - printf ("%s\t", reg_names[i]); + fputs_filtered (reg_names[i], stdout); + print_spaces_filtered (15 - strlen (reg_names[i]), stdout); /* If virtual format is floating, print it that way. */ if (TYPE_CODE (REGISTER_VIRTUAL_TYPE (i)) == TYPE_CODE_FLT && ! INVALID_FLOAT (virtual_buffer, REGISTER_VIRTUAL_SIZE (i))) val_print (REGISTER_VIRTUAL_TYPE (i), virtual_buffer, 0, - stdout, 0, 1); + stdout, 0, 1, 0, Val_pretty_default); /* Else if virtual format is too long for printf, print in hex a byte at a time. */ else if (REGISTER_VIRTUAL_SIZE (i) > sizeof (long)) { register int j; - printf ("0x"); + printf_filtered ("0x"); for (j = 0; j < REGISTER_VIRTUAL_SIZE (i); j++) - printf ("%02x", virtual_buffer[j]); + printf_filtered ("%02x", virtual_buffer[j]); } /* Else print as integer in hex and in decimal. */ else @@ -810,9 +832,9 @@ registers_info (addr_exp) bcopy (virtual_buffer, &val, sizeof (long)); if (val == 0) - printf ("0"); + printf_filtered ("0"); else - printf ("0x%08x %d", val, val); + printf_filtered ("0x%08x %d", val, val); } /* If register has different raw and virtual formats, @@ -822,18 +844,20 @@ registers_info (addr_exp) { register int j; - printf (" (raw 0x"); + printf_filtered (" (raw 0x"); for (j = 0; j < REGISTER_RAW_SIZE (i); j++) - printf ("%02x", raw_buffer[j]); - printf (")"); + printf_filtered ("%02x", raw_buffer[j]); + printf_filtered (")"); } - printf ("\n"); + printf_filtered ("\n"); } - - printf ("Contents are relative to selected stack frame.\n"); } #ifdef ATTACH_DETACH +#define PROCESS_ATTACH_ALLOWED 1 +#else +#define PROCESS_ATTACH_ALLOWED 0 +#endif /* * TODO: * Should save/restore the tty state since it might be that the @@ -841,6 +865,7 @@ registers_info (addr_exp) * the tty in some state other than what we want. If it's running * on another terminal or without a terminal, then saving and * restoring the tty state is a harmless no-op. + * This only needs to be done if we are attaching to a process. */ /* @@ -862,14 +887,18 @@ attach_command (args, from_tty) dont_repeat(); if (!args) - error_no_arg ("process-id to attach"); + error_no_arg ("process-id or device file to attach"); while (*args == ' ' || *args == '\t') args++; if (args[0] == '/') remote = 1; else +#ifndef ATTACH_DETACH + error ("Can't attach to a process on this machine."); +#else pid = atoi (args); +#endif if (inferior_pid) { @@ -891,13 +920,17 @@ attach_command (args, from_tty) fflush (stdout); } +#ifdef ATTACH_DETACH if (remote) { +#endif remote_open (args, from_tty); start_remote (); +#ifdef ATTACH_DETACH } else attach_program (pid); +#endif } /* @@ -918,24 +951,36 @@ detach_command (args, from_tty) { int signal = 0; - if (!inferior_pid) - error ("Not currently tracing a program\n"); - if (from_tty) +#ifdef ATTACH_DETACH + if (inferior_pid) { - char *exec_file = (char *)get_exec_file (0); - if (exec_file == 0) - exec_file = ""; - printf ("Detaching program: %s pid %d\n", - exec_file, inferior_pid); - fflush (stdout); + if (from_tty) + { + char *exec_file = (char *)get_exec_file (0); + if (exec_file == 0) + exec_file = ""; + printf ("Detaching program: %s pid %d\n", + exec_file, inferior_pid); + fflush (stdout); + } + if (args) + signal = atoi (args); + + detach (signal); + inferior_pid = 0; } - if (args) - signal = atoi (args); + else +#endif + { + if (!remote_debugging) + error ("Not currently attached to subsidiary or remote process."); - detach (signal); - inferior_pid = 0; + if (args) + error ("Argument given to \"detach\" when remotely debugging."); + + remote_close (from_tty); + } } -#endif /* ATTACH_DETACH */ /* ARGUSUED */ static void @@ -983,15 +1028,25 @@ This does not affect the program until the next \"run\" command.", #ifdef ATTACH_DETACH add_com ("attach", class_run, attach_command, "Attach to a process that was started up outside of GDB.\n\ -To do this, you must have permission to send the process a signal.\n\ -And it must have the same effective uid as the debugger.\n\n\ +This command may take as argument a process id or a device file.\n\ +For a process id, you must have permission to send the process a signal,\n\ +and it must have the same effective uid as the debugger.\n\ +For a device file, the file must be a connection to a remote debug server.\n\n\ Before using \"attach\", you must use the \"exec-file\" command\n\ to specify the program running in the process,\n\ and the \"symbol-file\" command to load its symbol table."); +#else + add_com ("attach", class_run, attach_command, + "Attach to a process that was started up outside of GDB.\n\ +This commands takes as an argument the name of a device file.\n\ +This file must be a connection to a remote debug server.\n\n\ +Before using \"attach\", you must use the \"exec-file\" command\n\ +to specify the program running in the process,\n\ +and the \"symbol-file\" command to load its symbol table."); +#endif add_com ("detach", class_run, detach_command, "Detach the process previously attached.\n\ The process is no longer traced and continues its execution."); -#endif /* ATTACH_DETACH */ add_com ("signal", class_run, signal_command, "Continue program giving it signal number SIGNUMBER."); @@ -1043,9 +1098,9 @@ then the same breakpoint won't break until the Nth time it is reached."); "Start debugged program. You may specify arguments to give it.\n\ Args may include \"*\", or \"[...]\"; they are expanded using \"sh\".\n\ Input and output redirection with \">\", \"<\", or \">>\" are also allowed.\n\n\ -With no arguments, uses arguments last specified (with \"run\" or \"set-args\".\n\ +With no arguments, uses arguments last specified (with \"run\" or \"set args\".\n\ To cancel previous arguments and run with no arguments,\n\ -use \"set-args\" without arguments."); +use \"set args\" without arguments."); add_com_alias ("r", "run", class_run, 1); add_info ("registers", registers_info, |