* 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
3 changed files with 156 additions and 44 deletions
|
@ -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)
|
Fri Jun 19 19:06:41 1992 John Gilmore (gnu at cygnus.com)
|
||||||
|
|
||||||
* remote-adapt.c, remote-eb.c, remote-mm.c: Lint. Fix
|
* remote-adapt.c, remote-eb.c, remote-mm.c: Lint. Fix
|
||||||
|
|
22
gdb/infcmd.c
22
gdb/infcmd.c
|
@ -413,6 +413,10 @@ jump_command (arg, from_tty)
|
||||||
register CORE_ADDR addr;
|
register CORE_ADDR addr;
|
||||||
struct symtabs_and_lines sals;
|
struct symtabs_and_lines sals;
|
||||||
struct symtab_and_line sal;
|
struct symtab_and_line sal;
|
||||||
|
struct symbol *fn;
|
||||||
|
struct symbol *sfn;
|
||||||
|
char *fname;
|
||||||
|
struct cleanup *back_to;
|
||||||
|
|
||||||
ERROR_NO_INFERIOR;
|
ERROR_NO_INFERIOR;
|
||||||
|
|
||||||
|
@ -433,13 +437,19 @@ jump_command (arg, from_tty)
|
||||||
|
|
||||||
resolve_sal_pc (&sal); /* May error out */
|
resolve_sal_pc (&sal); /* May error out */
|
||||||
|
|
||||||
|
/* 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))
|
||||||
{
|
{
|
||||||
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.");
|
error ("Not confirmed.");
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
do_cleanups (back_to);
|
||||||
}
|
}
|
||||||
|
|
||||||
addr = ADDR_BITS_SET (sal.pc);
|
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\
|
"Start debugged program. You may specify arguments to give it.\n\
|
||||||
Args may include \"*\", or \"[...]\"; they are expanded using \"sh\".\n\
|
Args may include \"*\", or \"[...]\"; they are expanded using \"sh\".\n\
|
||||||
Input and output redirection with \">\", \"<\", or \">>\" are also allowed.\n\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\
|
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_com_alias ("r", "run", class_run, 1);
|
||||||
|
|
165
gdb/stack.c
165
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
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
#include "param.h"
|
#include "value.h"
|
||||||
#include "language.h"
|
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
|
#include "gdbtypes.h"
|
||||||
|
#include "expression.h"
|
||||||
|
#include "language.h"
|
||||||
#include "frame.h"
|
#include "frame.h"
|
||||||
#include "gdbcmd.h"
|
#include "gdbcmd.h"
|
||||||
#include "value.h"
|
|
||||||
#include "gdbcore.h"
|
#include "gdbcore.h"
|
||||||
#include "target.h"
|
#include "target.h"
|
||||||
#include "breakpoint.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 addressprint; /* Print addresses, or stay symbolic only? */
|
||||||
extern int info_verbose; /* Verbosity of symbol reading msgs */
|
extern int info_verbose; /* Verbosity of symbol reading msgs */
|
||||||
extern int lines_to_list; /* # of lines "list" command shows by default */
|
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. */
|
May be zero, for no selected frame. */
|
||||||
|
|
||||||
FRAME selected_frame;
|
FRAME selected_frame;
|
||||||
|
@ -51,7 +105,6 @@ int selected_frame_level;
|
||||||
|
|
||||||
int frame_file_full_name = 0;
|
int frame_file_full_name = 0;
|
||||||
|
|
||||||
void print_frame_info ();
|
|
||||||
|
|
||||||
/* Print a stack frame briefly. FRAME should be the frame id
|
/* 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).
|
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)
|
if (addressprint)
|
||||||
printf_filtered ("%s in ", local_hex_string(fi->pc));
|
printf_filtered ("%s in ", local_hex_string(fi->pc));
|
||||||
|
|
||||||
fputs_demangled (fname, stdout, -1);
|
fputs_demangled (fname, stdout, 0);
|
||||||
fputs_filtered (" (...)\n", stdout);
|
fputs_filtered (" (...)\n", stdout);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CORE_NEEDS_RELOCATION
|
||||||
|
CORE_NEEDS_RELOCATION(fi->pc);
|
||||||
|
#endif
|
||||||
|
|
||||||
sal = find_pc_line (fi->pc, fi->next_frame);
|
sal = find_pc_line (fi->pc, fi->next_frame);
|
||||||
func = find_pc_function (fi->pc);
|
func = find_pc_function (fi->pc);
|
||||||
if (func)
|
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
|
ends has been truncated by ar because it is longer than 15
|
||||||
characters).
|
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.
|
up with a larger address for the function use that instead.
|
||||||
I don't think this can ever cause any problems;
|
I don't think this can ever cause any problems; there shouldn't
|
||||||
there shouldn't be any
|
be any minimal symbols in the middle of a function.
|
||||||
misc_function_vector symbols in the middle of a function. */
|
FIXME: (Not necessarily true. What about text labels) */
|
||||||
int misc_index = find_pc_misc_function (fi->pc);
|
|
||||||
if (misc_index >= 0
|
struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
|
||||||
&& (misc_function_vector[misc_index].address
|
if (msymbol != NULL
|
||||||
|
&& (msymbol -> address
|
||||||
> BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
|
> BLOCK_START (SYMBOL_BLOCK_VALUE (func))))
|
||||||
{
|
{
|
||||||
/* In this case we have no way of knowing the source file
|
/* 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
|
/* We also don't know anything about the function besides
|
||||||
its address and name. */
|
its address and name. */
|
||||||
func = 0;
|
func = 0;
|
||||||
funname = misc_function_vector[misc_index].name;
|
funname = msymbol -> name;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
funname = SYMBOL_NAME (func);
|
funname = SYMBOL_NAME (func);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
register int misc_index = find_pc_misc_function (fi->pc);
|
register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
|
||||||
if (misc_index >= 0)
|
if (msymbol != NULL)
|
||||||
funname = misc_function_vector[misc_index].name;
|
funname = msymbol -> name;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (source >= 0 || !sal.symtab)
|
if (source >= 0 || !sal.symtab)
|
||||||
|
@ -160,7 +218,7 @@ print_frame_info (fi, level, source, args)
|
||||||
if (addressprint)
|
if (addressprint)
|
||||||
if (fi->pc != sal.pc || !sal.symtab)
|
if (fi->pc != sal.pc || !sal.symtab)
|
||||||
printf_filtered ("%s in ", local_hex_string(fi->pc));
|
printf_filtered ("%s in ", local_hex_string(fi->pc));
|
||||||
fputs_demangled (funname ? funname : "??", stdout, -1);
|
fputs_demangled (funname ? funname : "??", stdout, 0);
|
||||||
wrap_here (" ");
|
wrap_here (" ");
|
||||||
fputs_filtered (" (", stdout);
|
fputs_filtered (" (", stdout);
|
||||||
if (args)
|
if (args)
|
||||||
|
@ -174,6 +232,16 @@ print_frame_info (fi, level, source, args)
|
||||||
wrap_here (" ");
|
wrap_here (" ");
|
||||||
printf_filtered (" at %s:%d", sal.symtab->filename, sal.line);
|
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");
|
printf_filtered ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,8 +265,6 @@ print_frame_info (fi, level, source, args)
|
||||||
fflush (stdout);
|
fflush (stdout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void flush_cached_frames ();
|
|
||||||
|
|
||||||
#ifdef FRAME_SPECIFICATION_DYADIC
|
#ifdef FRAME_SPECIFICATION_DYADIC
|
||||||
extern FRAME setup_arbitrary_frame ();
|
extern FRAME setup_arbitrary_frame ();
|
||||||
#endif
|
#endif
|
||||||
|
@ -312,8 +378,9 @@ parse_frame_specification (frame_exp)
|
||||||
This means absolutely all information in the frame is printed. */
|
This means absolutely all information in the frame is printed. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
frame_info (addr_exp)
|
frame_info (addr_exp, from_tty)
|
||||||
char *addr_exp;
|
char *addr_exp;
|
||||||
|
int from_tty;
|
||||||
{
|
{
|
||||||
FRAME frame;
|
FRAME frame;
|
||||||
struct frame_info *fi;
|
struct frame_info *fi;
|
||||||
|
@ -340,9 +407,9 @@ frame_info (addr_exp)
|
||||||
funname = SYMBOL_NAME (func);
|
funname = SYMBOL_NAME (func);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
register int misc_index = find_pc_misc_function (fi->pc);
|
register struct minimal_symbol *msymbol = lookup_minimal_symbol_by_pc (fi->pc);
|
||||||
if (misc_index >= 0)
|
if (msymbol != NULL)
|
||||||
funname = misc_function_vector[misc_index].name;
|
funname = msymbol -> name;
|
||||||
}
|
}
|
||||||
calling_frame = get_prev_frame (frame);
|
calling_frame = get_prev_frame (frame);
|
||||||
|
|
||||||
|
@ -362,7 +429,7 @@ frame_info (addr_exp)
|
||||||
if (funname)
|
if (funname)
|
||||||
{
|
{
|
||||||
printf_filtered (" in ");
|
printf_filtered (" in ");
|
||||||
fputs_demangled (funname, stdout, 1);
|
fputs_demangled (funname, stdout, DMGL_ANSI | DMGL_PARAMS);
|
||||||
}
|
}
|
||||||
wrap_here (" ");
|
wrap_here (" ");
|
||||||
if (sal.symtab)
|
if (sal.symtab)
|
||||||
|
@ -371,6 +438,16 @@ frame_info (addr_exp)
|
||||||
wrap_here (" ");
|
wrap_here (" ");
|
||||||
printf_filtered ("saved %s %s\n", reg_names[PC_REGNUM],
|
printf_filtered ("saved %s %s\n", reg_names[PC_REGNUM],
|
||||||
local_hex_string(FRAME_SAVED_PC (frame)));
|
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)
|
if (calling_frame)
|
||||||
printf_filtered (" called by frame at %s",
|
printf_filtered (" called by frame at %s",
|
||||||
local_hex_string(FRAME_FP (calling_frame)));
|
local_hex_string(FRAME_FP (calling_frame)));
|
||||||
|
@ -409,6 +486,15 @@ frame_info (addr_exp)
|
||||||
puts_filtered ("\n");
|
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)
|
#if defined (FRAME_FIND_SAVED_REGS)
|
||||||
get_frame_saved_regs (fi, &fsr);
|
get_frame_saved_regs (fi, &fsr);
|
||||||
|
@ -618,7 +704,7 @@ print_block_frame_labels (b, have_default, stream)
|
||||||
struct symtab_and_line sal;
|
struct symtab_and_line sal;
|
||||||
sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0);
|
sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym), 0);
|
||||||
values_printed = 1;
|
values_printed = 1;
|
||||||
fputs_demangled (SYMBOL_NAME (sym), stream, 1);
|
fputs_demangled (SYMBOL_NAME (sym), stream, DMGL_ANSI | DMGL_PARAMS);
|
||||||
if (addressprint)
|
if (addressprint)
|
||||||
fprintf_filtered (stream, " %s",
|
fprintf_filtered (stream, " %s",
|
||||||
local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
|
local_hex_string(SYMBOL_VALUE_ADDRESS (sym)));
|
||||||
|
@ -677,7 +763,6 @@ print_frame_label_vars (frame, this_level_only, stream)
|
||||||
int this_level_only;
|
int this_level_only;
|
||||||
register FILE *stream;
|
register FILE *stream;
|
||||||
{
|
{
|
||||||
extern struct blockvector *blockvector_for_pc ();
|
|
||||||
register struct blockvector *bl;
|
register struct blockvector *bl;
|
||||||
register struct block *block = get_frame_block (frame);
|
register struct block *block = get_frame_block (frame);
|
||||||
register int values_printed = 0;
|
register int values_printed = 0;
|
||||||
|
@ -755,7 +840,9 @@ locals_info (args, from_tty)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
catch_info ()
|
catch_info (ignore, from_tty)
|
||||||
|
char *ignore;
|
||||||
|
int from_tty;
|
||||||
{
|
{
|
||||||
if (!selected_frame)
|
if (!selected_frame)
|
||||||
error ("No frame selected.");
|
error ("No frame selected.");
|
||||||
|
@ -812,7 +899,9 @@ print_frame_arg_vars (frame, stream)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
args_info ()
|
args_info (ignore, from_tty)
|
||||||
|
char *ignore;
|
||||||
|
int from_tty;
|
||||||
{
|
{
|
||||||
if (!selected_frame)
|
if (!selected_frame)
|
||||||
error ("No frame selected.");
|
error ("No frame selected.");
|
||||||
|
@ -854,7 +943,7 @@ record_selected_frame (frameaddrp, levelp)
|
||||||
FRAME_ADDR *frameaddrp;
|
FRAME_ADDR *frameaddrp;
|
||||||
int *levelp;
|
int *levelp;
|
||||||
{
|
{
|
||||||
*frameaddrp = selected_frame ? FRAME_FP (selected_frame) : NULL;
|
*frameaddrp = selected_frame ? FRAME_FP (selected_frame) : 0;
|
||||||
*levelp = selected_frame_level;
|
*levelp = selected_frame_level;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1038,6 +1127,8 @@ return_command (retval_exp, from_tty)
|
||||||
FRAME_ADDR selected_frame_addr;
|
FRAME_ADDR selected_frame_addr;
|
||||||
CORE_ADDR selected_frame_pc;
|
CORE_ADDR selected_frame_pc;
|
||||||
FRAME frame;
|
FRAME frame;
|
||||||
|
char *funcname;
|
||||||
|
struct cleanup *back_to;
|
||||||
|
|
||||||
if (selected_frame == NULL)
|
if (selected_frame == NULL)
|
||||||
error ("No selected frame.");
|
error ("No selected frame.");
|
||||||
|
@ -1051,8 +1142,14 @@ return_command (retval_exp, from_tty)
|
||||||
{
|
{
|
||||||
if (thisfun != 0)
|
if (thisfun != 0)
|
||||||
{
|
{
|
||||||
if (!query ("Make %s return now? ", SYMBOL_NAME (thisfun)))
|
funcname = strdup_demangled (SYMBOL_NAME (thisfun));
|
||||||
|
back_to = make_cleanup (free, funcname);
|
||||||
|
if (!query ("Make %s return now? ", funcname))
|
||||||
|
{
|
||||||
error ("Not confirmed.");
|
error ("Not confirmed.");
|
||||||
|
/* NOTREACHED */
|
||||||
|
}
|
||||||
|
do_cleanups (back_to);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
if (!query ("Make selected stack frame return now? "))
|
if (!query ("Make selected stack frame return now? "))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue