mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-29 04:53:56 +08:00
* infcmd.c (jump_command): Use cleanups to avoid memory leaks.
* stack.c (return_command): Use cleanups to avoid memory leaks.
This commit is contained in:
parent
e95bfbf19c
commit
b4fde6fa65
@ -1,3 +1,8 @@
|
||||
Sat Jun 20 16:28:39 1992 Fred Fish (fnf@cygnus.com)
|
||||
|
||||
* infcmd.c (jump_command): Use cleanups to avoid memory leaks.
|
||||
* stack.c (return_command): Use cleanups to avoid memory leaks.
|
||||
|
||||
Fri Jun 19 19:06:41 1992 John Gilmore (gnu at cygnus.com)
|
||||
|
||||
* remote-adapt.c, remote-eb.c, remote-mm.c: Lint. Fix
|
||||
|
28
gdb/infcmd.c
28
gdb/infcmd.c
@ -413,6 +413,10 @@ jump_command (arg, from_tty)
|
||||
register CORE_ADDR addr;
|
||||
struct symtabs_and_lines sals;
|
||||
struct symtab_and_line sal;
|
||||
struct symbol *fn;
|
||||
struct symbol *sfn;
|
||||
char *fname;
|
||||
struct cleanup *back_to;
|
||||
|
||||
ERROR_NO_INFERIOR;
|
||||
|
||||
@ -433,14 +437,20 @@ jump_command (arg, from_tty)
|
||||
|
||||
resolve_sal_pc (&sal); /* May error out */
|
||||
|
||||
{
|
||||
struct symbol *fn = get_frame_function (get_current_frame ());
|
||||
struct symbol *sfn = find_pc_function (sal.pc);
|
||||
if (fn != 0 && sfn != fn
|
||||
&& ! query ("Line %d is not in `%s'. Jump anyway? ",
|
||||
sal.line, SYMBOL_NAME (fn)))
|
||||
error ("Not confirmed.");
|
||||
}
|
||||
/* See if we are trying to jump to another function. */
|
||||
fn = get_frame_function (get_current_frame ());
|
||||
sfn = find_pc_function (sal.pc);
|
||||
if (fn != NULL && sfn != fn)
|
||||
{
|
||||
fname = strdup_demangled (SYMBOL_NAME (fn));
|
||||
back_to = make_cleanup (free, fname);
|
||||
if (!query ("Line %d is not in `%s'. Jump anyway? ", sal.line, fname))
|
||||
{
|
||||
error ("Not confirmed.");
|
||||
/* NOTREACHED */
|
||||
}
|
||||
do_cleanups (back_to);
|
||||
}
|
||||
|
||||
addr = ADDR_BITS_SET (sal.pc);
|
||||
|
||||
@ -1203,7 +1213,7 @@ 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.");
|
||||
add_com_alias ("r", "run", class_run, 1);
|
||||
|
167
gdb/stack.c
167
gdb/stack.c
@ -17,25 +17,79 @@ You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include "defs.h"
|
||||
#include "param.h"
|
||||
#include "language.h"
|
||||
#include "value.h"
|
||||
#include "symtab.h"
|
||||
#include "gdbtypes.h"
|
||||
#include "expression.h"
|
||||
#include "language.h"
|
||||
#include "frame.h"
|
||||
#include "gdbcmd.h"
|
||||
#include "value.h"
|
||||
#include "gdbcore.h"
|
||||
#include "target.h"
|
||||
#include "breakpoint.h"
|
||||
#include "demangle.h"
|
||||
|
||||
static void
|
||||
return_command PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
down_command PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
down_silently_command PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
up_command PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
up_silently_command PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
frame_command PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
select_frame_command PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
args_info PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
print_frame_arg_vars PARAMS ((FRAME, FILE *));
|
||||
|
||||
static void
|
||||
catch_info PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
locals_info PARAMS ((char *, int));
|
||||
|
||||
static void
|
||||
print_frame_label_vars PARAMS ((FRAME, int, FILE *));
|
||||
|
||||
static void
|
||||
print_frame_local_vars PARAMS ((FRAME, FILE *));
|
||||
|
||||
static int
|
||||
print_block_frame_labels PARAMS ((struct block *, int *, FILE *));
|
||||
|
||||
static int
|
||||
print_block_frame_locals PARAMS ((struct block *, FRAME, FILE *));
|
||||
|
||||
static void
|
||||
backtrace_command PARAMS ((char *, int));
|
||||
|
||||
static FRAME
|
||||
parse_frame_specification PARAMS ((char *));
|
||||
|
||||
static void
|
||||
frame_info PARAMS ((char *, int));
|
||||
|
||||
|
||||
extern int addressprint; /* Print addresses, or stay symbolic only? */
|
||||
extern int info_verbose; /* Verbosity of symbol reading msgs */
|
||||
extern int lines_to_list; /* # of lines "list" command shows by default */
|
||||
extern char *reg_names[]; /* Names of registers */
|
||||
|
||||
/* Thie "selected" stack frame is used by default for local and arg access.
|
||||
/* The "selected" stack frame is used by default for local and arg access.
|
||||
May be zero, for no selected frame. */
|
||||
|
||||
FRAME selected_frame;
|
||||
@ -51,7 +105,6 @@ int selected_frame_level;
|
||||
|
||||
int frame_file_full_name = 0;
|
||||
|
||||
void print_frame_info ();
|
||||
|
||||
/* Print a stack frame briefly. FRAME should be the frame id
|
||||
and LEVEL should be its level in the stack (or -1 for level not defined).
|
||||
@ -106,13 +159,17 @@ print_frame_info (fi, level, source, args)
|
||||
if (addressprint)
|
||||
printf_filtered ("%s in ", local_hex_string(fi->pc));
|
||||
|
||||
fputs_demangled (fname, stdout, -1);
|
||||
fputs_demangled (fname, stdout, 0);
|
||||
fputs_filtered (" (...)\n", stdout);
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CORE_NEEDS_RELOCATION
|
||||
CORE_NEEDS_RELOCATION(fi->pc);
|
||||
#endif
|
||||
|
||||
sal = find_pc_line (fi->pc, fi->next_frame);
|
||||
func = find_pc_function (fi->pc);
|
||||
if (func)
|
||||
@ -125,14 +182,15 @@ print_frame_info (fi, level, source, args)
|
||||
ends has been truncated by ar because it is longer than 15
|
||||
characters).
|
||||
|
||||
So look in the misc_function_vector as well, and if it comes
|
||||
So look in the minimal symbol tables as well, and if it comes
|
||||
up with a larger address for the function use that instead.
|
||||
I don't think this can ever cause any problems;
|
||||
there shouldn't be any
|
||||
misc_function_vector symbols in the middle of a function. */
|
||||
int misc_index = find_pc_misc_function (fi->pc);
|
||||
if (misc_index >= 0
|
||||
&& (misc_function_vector[misc_index].address
|
||||
I don't think this can ever cause any problems; there shouldn't
|
||||
be any minimal symbols in the middle of a function.
|
||||
FIXME: (Not necessarily true. What about text labels) */
|
||||
|
||||
struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
|
||||
if (msymbol != NULL
|
||||
&& (msymbol -> address
|
||||
> BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
|
||||
{
|
||||
/* In this case we have no way of knowing the source file
|
||||
@ -141,16 +199,16 @@ print_frame_info (fi, level, source, args)
|
||||
/* We also don't know anything about the function besides
|
||||
its address and name. */
|
||||
func = 0;
|
||||
funname = misc_function_vector[misc_index].name;
|
||||
funname = msymbol -> name;
|
||||
}
|
||||
else
|
||||
funname = SYMBOL_NAME (func);
|
||||
}
|
||||
else
|
||||
{
|
||||
register int misc_index = find_pc_misc_function (fi->pc);
|
||||
if (misc_index >= 0)
|
||||
funname = misc_function_vector[misc_index].name;
|
||||
register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
|
||||
if (msymbol != NULL)
|
||||
funname = msymbol -> name;
|
||||
}
|
||||
|
||||
if (source >= 0 || !sal.symtab)
|
||||
@ -160,7 +218,7 @@ print_frame_info (fi, level, source, args)
|
||||
if (addressprint)
|
||||
if (fi->pc != sal.pc || !sal.symtab)
|
||||
printf_filtered ("%s in ", local_hex_string(fi->pc));
|
||||
fputs_demangled (funname ? funname : "??", stdout, -1);
|
||||
fputs_demangled (funname ? funname : "??", stdout, 0);
|
||||
wrap_here (" ");
|
||||
fputs_filtered (" (", stdout);
|
||||
if (args)
|
||||
@ -174,6 +232,16 @@ print_frame_info (fi, level, source, args)
|
||||
wrap_here (" ");
|
||||
printf_filtered (" at %s:%d", sal.symtab->filename, sal.line);
|
||||
}
|
||||
|
||||
#ifdef PC_LOAD_SEGMENT
|
||||
/* If we couldn't print out function name but if can figure out what
|
||||
load segment this pc value is from, at least print out some info
|
||||
about its load segment. */
|
||||
if (!funname) {
|
||||
wrap_here (" ");
|
||||
printf_filtered (" from %s", PC_LOAD_SEGMENT (fi->pc));
|
||||
}
|
||||
#endif
|
||||
printf_filtered ("\n");
|
||||
}
|
||||
|
||||
@ -197,8 +265,6 @@ print_frame_info (fi, level, source, args)
|
||||
fflush (stdout);
|
||||
}
|
||||
|
||||
void flush_cached_frames ();
|
||||
|
||||
#ifdef FRAME_SPECIFICATION_DYADIC
|
||||
extern FRAME setup_arbitrary_frame ();
|
||||
#endif
|
||||
@ -312,8 +378,9 @@ parse_frame_specification (frame_exp)
|
||||
This means absolutely all information in the frame is printed. */
|
||||
|
||||
static void
|
||||
frame_info (addr_exp)
|
||||
frame_info (addr_exp, from_tty)
|
||||
char *addr_exp;
|
||||
int from_tty;
|
||||
{
|
||||
FRAME frame;
|
||||
struct frame_info *fi;
|
||||
@ -340,9 +407,9 @@ frame_info (addr_exp)
|
||||
funname = SYMBOL_NAME (func);
|
||||
else
|
||||
{
|
||||
register int misc_index = find_pc_misc_function (fi->pc);
|
||||
if (misc_index >= 0)
|
||||
funname = misc_function_vector[misc_index].name;
|
||||
register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
|
||||
if (msymbol != NULL)
|
||||
funname = msymbol -> name;
|
||||
}
|
||||
calling_frame = get_prev_frame (frame);
|
||||
|
||||
@ -362,7 +429,7 @@ frame_info (addr_exp)
|
||||
if (funname)
|
||||
{
|
||||
printf_filtered (" in ");
|
||||
fputs_demangled (funname, stdout, 1);
|
||||
fputs_demangled (funname, stdout, DMGL_ANSI | DMGL_PARAMS);
|
||||
}
|
||||
wrap_here (" ");
|
||||
if (sal.symtab)
|
||||
@ -371,6 +438,16 @@ frame_info (addr_exp)
|
||||
wrap_here (" ");
|
||||
printf_filtered ("saved %s %s\n", reg_names[PC_REGNUM],
|
||||
local_hex_string(FRAME_SAVED_PC (frame)));
|
||||
|
||||
{
|
||||
int frameless = 0;
|
||||
#ifdef FRAMELESS_FUNCTION_INVOCATION
|
||||
FRAMELESS_FUNCTION_INVOCATION (fi, frameless);
|
||||
#endif
|
||||
if (frameless)
|
||||
printf_filtered (" (FRAMELESS),");
|
||||
}
|
||||
|
||||
if (calling_frame)
|
||||
printf_filtered (" called by frame at %s",
|
||||
local_hex_string(FRAME_FP (calling_frame)));
|
||||
@ -409,6 +486,15 @@ frame_info (addr_exp)
|
||||
puts_filtered ("\n");
|
||||
}
|
||||
}
|
||||
{
|
||||
/* Address of the local variables for this frame, or 0. */
|
||||
CORE_ADDR arg_list = FRAME_LOCALS_ADDRESS (fi);
|
||||
|
||||
if (arg_list == 0)
|
||||
printf_filtered (" Locals at unknown address,");
|
||||
else
|
||||
printf_filtered (" Locals at %s,", local_hex_string(arg_list));
|
||||
}
|
||||
|
||||
#if defined (FRAME_FIND_SAVED_REGS)
|
||||
get_frame_saved_regs (fi, &fsr);
|
||||
@ -618,7 +704,7 @@ print_block_frame_labels (b, have_default, stream)
|
||||
struct symtab_and_line sal;
|
||||
sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0);
|
||||
values_printed = 1;
|
||||
fputs_demangled (SYMBOL_NAME (sym), stream, 1);
|
||||
fputs_demangled (SYMBOL_NAME (sym), stream, DMGL_ANSI | DMGL_PARAMS);
|
||||
if (addressprint)
|
||||
fprintf_filtered (stream, " %s",
|
||||
local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
|
||||
@ -677,7 +763,6 @@ print_frame_label_vars (frame, this_level_only, stream)
|
||||
int this_level_only;
|
||||
register FILE *stream;
|
||||
{
|
||||
extern struct blockvector *blockvector_for_pc ();
|
||||
register struct blockvector *bl;
|
||||
register struct block *block = get_frame_block (frame);
|
||||
register int values_printed = 0;
|
||||
@ -755,7 +840,9 @@ locals_info (args, from_tty)
|
||||
}
|
||||
|
||||
static void
|
||||
catch_info ()
|
||||
catch_info (ignore, from_tty)
|
||||
char *ignore;
|
||||
int from_tty;
|
||||
{
|
||||
if (!selected_frame)
|
||||
error ("No frame selected.");
|
||||
@ -812,7 +899,9 @@ print_frame_arg_vars (frame, stream)
|
||||
}
|
||||
|
||||
static void
|
||||
args_info ()
|
||||
args_info (ignore, from_tty)
|
||||
char *ignore;
|
||||
int from_tty;
|
||||
{
|
||||
if (!selected_frame)
|
||||
error ("No frame selected.");
|
||||
@ -854,7 +943,7 @@ record_selected_frame (frameaddrp, levelp)
|
||||
FRAME_ADDR *frameaddrp;
|
||||
int *levelp;
|
||||
{
|
||||
*frameaddrp = selected_frame ? FRAME_FP (selected_frame) : NULL;
|
||||
*frameaddrp = selected_frame ? FRAME_FP (selected_frame) : 0;
|
||||
*levelp = selected_frame_level;
|
||||
}
|
||||
|
||||
@ -1038,6 +1127,8 @@ return_command (retval_exp, from_tty)
|
||||
FRAME_ADDR selected_frame_addr;
|
||||
CORE_ADDR selected_frame_pc;
|
||||
FRAME frame;
|
||||
char *funcname;
|
||||
struct cleanup *back_to;
|
||||
|
||||
if (selected_frame == NULL)
|
||||
error ("No selected frame.");
|
||||
@ -1051,8 +1142,14 @@ return_command (retval_exp, from_tty)
|
||||
{
|
||||
if (thisfun != 0)
|
||||
{
|
||||
if (!query ("Make %s return now? ", SYMBOL_NAME (thisfun)))
|
||||
error ("Not confirmed.");
|
||||
funcname = strdup_demangled (SYMBOL_NAME (thisfun));
|
||||
back_to = make_cleanup (free, funcname);
|
||||
if (!query ("Make %s return now? ", funcname))
|
||||
{
|
||||
error ("Not confirmed.");
|
||||
/* NOTREACHED */
|
||||
}
|
||||
do_cleanups (back_to);
|
||||
}
|
||||
else
|
||||
if (!query ("Make selected stack frame return now? "))
|
||||
|
Loading…
Reference in New Issue
Block a user