This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
{commit: gdb/mi] -stack-list-locals and -var-list-children
- From: Nick Roberts <nick at nick dot uklinux dot net>
- To: gdb-patches at sources dot redhat dot com
- Date: Tue, 20 Jan 2004 01:18:52 +0000
- Subject: {commit: gdb/mi] -stack-list-locals and -var-list-children
I've comitted the patches below. Testcases don't work for me but I've kept the
status quo so they should work for others. Diff's have been made with Emacs
backup files - sorry, should have made the patches before committing, done
off-line - 64k modem, family to feed etc. I hope they work... Well they
compile anyway.
Nick http://www.nick.uklinux.net
2004-01-20 Nick Roberts <nick at nick dot uklinux dot net>
* mi/mi-cmds.h (enum print_values): Add definition.
* mi/mi-cmd-stack.c (mi_cmd_stack_list_locals): Print the name,
type and value for simple data types and just the name and type
for complex ones, if required.
* mi/mi-cmd-var.c (mi_cmd_var_list_children): Print the values of the
children, if required.
2004-01-19 Nick Roberts <nick at nick dot uklinux dot net>
* gdb.texinfo (GDB/MI Stack Manipulation): Describe extension to
-stack-list-locals.
(GDB/MI Variable Objects): Describe extension to
-var-list-children.
2004-01-20 Nick Roberts <nick at nick dot uklinux dot net>
* gdb.mi/mi-stack.exp (test_stack_locals_listing): Test for
case "-stack-list-locals 2".
* gdb.mi/mi-var-child.exp: Test for case
"-var-list-children --all-values NAME".
*** /home/nick/gdb/gdb/mi/mi-cmds.h~ 2003-08-05 00:18:50.000000000 +0100
--- /home/nick/gdb/gdb/mi/mi-cmds.h 2004-01-19 23:25:52.000000000 +0000
***************
*** 48,53 ****
--- 48,59 ----
MI_CMD_QUIET
};
+ enum print_values {
+ PRINT_NO_VALUES,
+ PRINT_ALL_VALUES,
+ PRINT_SIMPLE_VALUES
+ };
+
typedef enum mi_cmd_result (mi_cmd_argv_ftype) (char *command, char **argv, int argc);
/* Older MI commands have this interface. Retained until all old
*** /home/nick/gdb/gdb/mi/mi-cmd-stack.c~ 2003-06-12 00:29:49.000000000 +0100
--- /home/nick/gdb/gdb/mi/mi-cmd-stack.c 2004-01-19 23:27:51.000000000 +0000
***************
*** 29,34 ****
--- 29,35 ----
#include "block.h"
#include "stack.h"
#include "dictionary.h"
+ #include "gdb_string.h"
static void list_args_or_locals (int locals, int values, struct frame_info *fi);
***************
*** 137,146 ****
enum mi_cmd_result
mi_cmd_stack_list_locals (char *command, char **argv, int argc)
{
if (argc != 1)
error ("mi_cmd_stack_list_locals: Usage: PRINT_VALUES");
! list_args_or_locals (1, atoi (argv[0]), deprecated_selected_frame);
return MI_CMD_DONE;
}
--- 138,163 ----
enum mi_cmd_result
mi_cmd_stack_list_locals (char *command, char **argv, int argc)
{
+ struct frame_info *frame;
+ enum print_values print_values;
+
if (argc != 1)
error ("mi_cmd_stack_list_locals: Usage: PRINT_VALUES");
! frame = get_selected_frame ();
!
! if (strcmp (argv[0], "0") == 0
! || strcmp (argv[0], "--no-values") == 0)
! print_values = PRINT_NO_VALUES;
! else if (strcmp (argv[0], "1") == 0
! || strcmp (argv[0], "--all-values") == 0)
! print_values = PRINT_ALL_VALUES;
! else if (strcmp (argv[0], "2") == 0
! || strcmp (argv[0], "--simple-values") == 0)
! print_values = PRINT_SIMPLE_VALUES;
! else
! error ("Unknown value for PRINT_VALUES: must be: 0 or \"--no-values\", 1 or \"--all-values\", 2 or \"--simple-values\"");
! list_args_or_locals (1, print_values, frame);
return MI_CMD_DONE;
}
***************
*** 218,223 ****
--- 235,241 ----
int nsyms;
struct cleanup *cleanup_list;
static struct ui_stream *stb = NULL;
+ struct type *type;
stb = ui_out_stream_new (uiout);
***************
*** 268,291 ****
if (print_me)
{
struct cleanup *cleanup_tuple = NULL;
! if (values)
! cleanup_tuple =
make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
! ui_out_field_string (uiout, "name", DEPRECATED_SYMBOL_NAME (sym));
! if (values)
! {
! struct symbol *sym2;
! if (!locals)
! sym2 = lookup_symbol (DEPRECATED_SYMBOL_NAME (sym),
! block, VAR_DOMAIN,
! (int *) NULL,
! (struct symtab **) NULL);
! else
sym2 = sym;
print_variable_value (sym2, fi, stb->stream);
ui_out_field_stream (uiout, "value", stb);
do_cleanups (cleanup_tuple);
}
}
}
--- 286,324 ----
if (print_me)
{
struct cleanup *cleanup_tuple = NULL;
! if (values != PRINT_NO_VALUES)
! cleanup_tuple =
make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
! ui_out_field_string (uiout, "name", SYMBOL_PRINT_NAME (sym));
! struct symbol *sym2;
! if (!locals)
! sym2 = lookup_symbol (SYMBOL_NATURAL_NAME (sym),
! block, VAR_DOMAIN,
! (int *) NULL,
! (struct symtab **) NULL);
! else
sym2 = sym;
+ switch (values)
+ {
+ case PRINT_SIMPLE_VALUES:
+ type = check_typedef (sym2->type);
+ type_print (sym2->type, "", stb->stream, -1);
+ ui_out_field_stream (uiout, "type", stb);
+ if (TYPE_CODE (type) != TYPE_CODE_ARRAY
+ && TYPE_CODE (type) != TYPE_CODE_STRUCT
+ && TYPE_CODE (type) != TYPE_CODE_UNION)
+ {
+ print_variable_value (sym2, fi, stb->stream);
+ ui_out_field_stream (uiout, "value", stb);
+ }
+ do_cleanups (cleanup_tuple);
+ break;
+ case PRINT_ALL_VALUES:
print_variable_value (sym2, fi, stb->stream);
ui_out_field_stream (uiout, "value", stb);
do_cleanups (cleanup_tuple);
+ break;
}
}
}
*** /home/nick/gdb/gdb/mi/mi-cmd-stack.c~ 2003-06-12 00:29:49.000000000 +0100
--- /home/nick/gdb/gdb/mi/mi-cmd-stack.c 2004-01-19 23:27:51.000000000 +0000
***************
*** 29,34 ****
--- 29,35 ----
#include "block.h"
#include "stack.h"
#include "dictionary.h"
+ #include "gdb_string.h"
static void list_args_or_locals (int locals, int values, struct frame_info *fi);
***************
*** 137,146 ****
enum mi_cmd_result
mi_cmd_stack_list_locals (char *command, char **argv, int argc)
{
if (argc != 1)
error ("mi_cmd_stack_list_locals: Usage: PRINT_VALUES");
! list_args_or_locals (1, atoi (argv[0]), deprecated_selected_frame);
return MI_CMD_DONE;
}
--- 138,163 ----
enum mi_cmd_result
mi_cmd_stack_list_locals (char *command, char **argv, int argc)
{
+ struct frame_info *frame;
+ enum print_values print_values;
+
if (argc != 1)
error ("mi_cmd_stack_list_locals: Usage: PRINT_VALUES");
! frame = get_selected_frame ();
!
! if (strcmp (argv[0], "0") == 0
! || strcmp (argv[0], "--no-values") == 0)
! print_values = PRINT_NO_VALUES;
! else if (strcmp (argv[0], "1") == 0
! || strcmp (argv[0], "--all-values") == 0)
! print_values = PRINT_ALL_VALUES;
! else if (strcmp (argv[0], "2") == 0
! || strcmp (argv[0], "--simple-values") == 0)
! print_values = PRINT_SIMPLE_VALUES;
! else
! error ("Unknown value for PRINT_VALUES: must be: 0 or \"--no-values\", 1 or \"--all-values\", 2 or \"--simple-values\"");
! list_args_or_locals (1, print_values, frame);
return MI_CMD_DONE;
}
***************
*** 218,223 ****
--- 235,241 ----
int nsyms;
struct cleanup *cleanup_list;
static struct ui_stream *stb = NULL;
+ struct type *type;
stb = ui_out_stream_new (uiout);
***************
*** 268,291 ****
if (print_me)
{
struct cleanup *cleanup_tuple = NULL;
! if (values)
! cleanup_tuple =
make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
! ui_out_field_string (uiout, "name", DEPRECATED_SYMBOL_NAME (sym));
! if (values)
! {
! struct symbol *sym2;
! if (!locals)
! sym2 = lookup_symbol (DEPRECATED_SYMBOL_NAME (sym),
! block, VAR_DOMAIN,
! (int *) NULL,
! (struct symtab **) NULL);
! else
sym2 = sym;
print_variable_value (sym2, fi, stb->stream);
ui_out_field_stream (uiout, "value", stb);
do_cleanups (cleanup_tuple);
}
}
}
--- 286,324 ----
if (print_me)
{
struct cleanup *cleanup_tuple = NULL;
! if (values != PRINT_NO_VALUES)
! cleanup_tuple =
make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
! ui_out_field_string (uiout, "name", SYMBOL_PRINT_NAME (sym));
! struct symbol *sym2;
! if (!locals)
! sym2 = lookup_symbol (SYMBOL_NATURAL_NAME (sym),
! block, VAR_DOMAIN,
! (int *) NULL,
! (struct symtab **) NULL);
! else
sym2 = sym;
+ switch (values)
+ {
+ case PRINT_SIMPLE_VALUES:
+ type = check_typedef (sym2->type);
+ type_print (sym2->type, "", stb->stream, -1);
+ ui_out_field_stream (uiout, "type", stb);
+ if (TYPE_CODE (type) != TYPE_CODE_ARRAY
+ && TYPE_CODE (type) != TYPE_CODE_STRUCT
+ && TYPE_CODE (type) != TYPE_CODE_UNION)
+ {
+ print_variable_value (sym2, fi, stb->stream);
+ ui_out_field_stream (uiout, "value", stb);
+ }
+ do_cleanups (cleanup_tuple);
+ break;
+ case PRINT_ALL_VALUES:
print_variable_value (sym2, fi, stb->stream);
ui_out_field_stream (uiout, "value", stb);
do_cleanups (cleanup_tuple);
+ break;
}
}
}
*** /home/nick/gdb/gdb/doc/gdb.texinfo~ 2004-01-19 23:11:48.000000000 +0000
--- /home/nick/gdb/gdb/doc/gdb.texinfo 2004-01-19 23:25:02.000000000 +0000
***************
*** 17206,17213 ****
@end smallexample
Display the local variable names for the current frame. With an
! argument of 0 prints only the names of the variables, with argument of 1
! prints also their values.
@subsubheading @value{GDBN} Command
--- 17206,17219 ----
@end smallexample
Display the local variable names for the current frame. With an
! argument of 0 or @code{--no-values}, prints only the names of the variables.
! With argument of 1 or @code{--all-values}, prints also their values. With
! argument of 2 or @code{--simple-values}, prints the name, type and value for
! simple data types and the name and type for arrays, structures and
! unions. In this last case, the idea is that the user can see the
! value of simple data types immediately and he can create variable
! objects for other data types if he wishes to explore their values in
! more detail.
@subsubheading @value{GDBN} Command
***************
*** 17220,17228 ****
-stack-list-locals 0
^done,locals=[name="A",name="B",name="C"]
(@value{GDBP})
! -stack-list-locals 1
^done,locals=[@{name="A",value="1"@},@{name="B",value="2"@},
! @{name="C",value="3"@}]
(@value{GDBP})
@end smallexample
--- 17226,17237 ----
-stack-list-locals 0
^done,locals=[name="A",name="B",name="C"]
(@value{GDBP})
! -stack-list-locals --all-values
^done,locals=[@{name="A",value="1"@},@{name="B",value="2"@},
! @{name="C",value="@{1, 2, 3@}"@}]
! -stack-list-locals --simple-values
! ^done,locals=[@{name="A",type="int",value="1"@},
! @{name="B",type="int",value="2"@},@{name="C",type="int [3]"@}]
(@value{GDBP})
@end smallexample
***************
*** 18166,18179 ****
@subsubheading Synopsis
@smallexample
! -var-list-children @var{name}
@end smallexample
! Returns a list of the children of the specified variable object:
@smallexample
numchild=@var{n},children=[@{name=@var{name},
numchild=@var{n},type=@var{type}@},@r{(repeats N times)}]
@end smallexample
--- 18175,18200 ----
@subsubheading Synopsis
@smallexample
! -var-list-children [@var{print-values}] @var{name}
@end smallexample
! Returns a list of the children of the specified variable object. With
! just the variable object name as an argument or with an optional
! preceding argument of 0 or @code{--no-values}, prints only the names of the
! variables. With an optional preceding argument of 1 or @code{--all-values},
! also prints their values.
!
! @subsubheading Example
@smallexample
+ (@value{GDBP})
+ -var-list-children n
numchild=@var{n},children=[@{name=@var{name},
numchild=@var{n},type=@var{type}@},@r{(repeats N times)}]
+ (@value{GDBP})
+ -var-list-children --all-values n
+ numchild=@var{n},children=[@{name=@var{name},
+ numchild=@var{n},value=@var{value},type=@var{type}@},@r{(repeats N times)}]
@end smallexample
*** /home/nick/gdb/gdb/testsuite/gdb.mi/mi-stack.exp~ 2002-11-05 15:43:18.000000000 +0000
--- /home/nick/gdb/gdb/testsuite/gdb.mi/mi-stack.exp 2004-01-19 23:14:32.000000000 +0000
***************
*** 149,154 ****
--- 149,155 ----
# Tests:
# -stack-list-locals 0
# -stack-list-locals 1
+ # -stack-list-locals 2
# -stack-list-arguments
mi_gdb_test "232-stack-list-locals 0" \
***************
*** 168,173 ****
--- 169,178 ----
"232\\^done,locals=\\\[\{name=\"A\",value=\"1\"\},\{name=\"B\",value=\"2\"\},\{name=\"C\",value=\"3\"\}\\\]" \
"stack locals listing 1"
+ mi_gdb_test "232-stack-list-locals 2" \
+ "232\\^done,locals=\\\[\{name=\"A\",type=\"int\",value=\"1\"\},\{name=\"B\",type=\"int\",value=\"2\"\},\{name=\"C\",type=\"int\",value=\"3\"\}\\\]" \
+ "stack locals listing 2"
+
mi_gdb_test "234-stack-list-locals" \
"234\\^error,msg=\"mi_cmd_stack_list_locals: Usage.*PRINT_VALUES.*\"" \
"stack locals listing wrong"
*** /home/nick/gdb/gdb/testsuite/gdb.mi/mi-var-child.exp~ 2004-01-19 23:15:54.000000000 +0000
--- /home/nick/gdb/gdb/testsuite/gdb.mi/mi-var-child.exp 2004-01-20 00:01:51.000000000 +0000
***************
*** 827,832 ****
--- 827,836 ----
set line 208
mi_execute_to "exec-step 7" "end-stepping-range" do_children_tests {} {.*var-cmd.c} $line {} "step $line"
+ mi_gdb_test "-var-list-children --all-values struct_declarations.long_array" \
+ "\\^done,numchild=\"10\",children=\\\[child=\{name=\"struct_declarations.long_array.0\",exp=\"0\",numchild=\"0\",value=\"1234\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.1\",exp=\"1\",numchild=\"0\",value=\"2345\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.2\",exp=\"2\",numchild=\"0\",value=\"3456\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.3\",exp=\"3\",numchild=\"0\",value=\"4567\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.4\",exp=\"4\",numchild=\"0\",value=\"5678\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.5\",exp=\"5\",numchild=\"0\",value=\"6789\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.6\",exp=\"6\",numchild=\"0\",value=\"7890\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.7\",exp=\"7\",numchild=\"0\",value=\"8901\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.8\",exp=\"8\",numchild=\"0\",value=\"9012\",type=\"long int\"\},child=\{name=\"struct_declarations.long_array.9\",exp=\"9\",numchild=\"0\",value=\"1234\",type=\"long int\"\}\\\]" \
+ "listing of names and values of children"
+
# Test: c_variable-5.8
# Desc: check that long_array[3-9] changed
mi_gdb_test "-var-update *" \