From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4469 invoked by alias); 7 Nov 2002 17:04:16 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 4452 invoked from network); 7 Nov 2002 17:04:14 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 7 Nov 2002 17:04:14 -0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id gA7GfSw08420 for ; Thu, 7 Nov 2002 11:41:28 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [172.16.52.156]) by int-mx1.corp.redhat.com (8.11.6/8.11.6) with ESMTP id gA7H42f22279; Thu, 7 Nov 2002 12:04:02 -0500 Received: from localhost.redhat.com (romulus-int.sfbay.redhat.com [172.16.27.46]) by pobox.corp.redhat.com (8.11.6/8.11.6) with ESMTP id gA7H40T22336; Thu, 7 Nov 2002 12:04:00 -0500 Received: by localhost.redhat.com (Postfix, from userid 469) id 4F5BBFF79; Thu, 7 Nov 2002 11:59:53 -0500 (EST) From: Elena Zannoni MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <15818.39944.755909.902776@localhost.redhat.com> Date: Thu, 07 Nov 2002 09:04:00 -0000 To: Jelmer Vernooij Cc: gdb-patches@sources.redhat.com, Andrew Cagney , Elena Zannoni Subject: Re: [PATCH] mi-symbol-* In-Reply-To: <20021105204529.GA11137@charis.vernstok> References: <20021105204529.GA11137@charis.vernstok> X-SW-Source: 2002-11/txt/msg00176.txt.bz2 Jelmer Vernooij writes: > Hi! > > Here's the latest version of my mi-symbol-* patch. I received the copyright > assignment I signed back today from the FSF, signed by Bradly Kuhn. > Anything else I should do before the patch gets in and who will put it > in? > I think we are getting closer, but there is still some work to be done. Every new command in the mi should have test cases. See below for specific comments. > Thanks, > > Jelmer > > -- > Jelmer Vernooij - http://nl.linux.org/~jelmer/ > 18:04:45 up 3 days, 10:58, 9 users, load average: 0.13, 0.54, 0.50 > diff -r -u gdb+dejagnu-20020907/gdb/Makefile.in gdb-jelmer/gdb/Makefile.in > --- gdb+dejagnu-20020907/gdb/Makefile.in 2002-09-02 20:09:06.000000000 +0200 > +++ gdb-jelmer/gdb/Makefile.in 2002-09-11 20:22:30.000000000 +0200 > @@ -165,12 +165,12 @@ > mi-out.o mi-console.o \ > mi-cmds.o mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \ > mi-cmd-disas.o \ > - mi-main.o mi-parse.o mi-getopt.o > + mi-main.o mi-parse.o mi-getopt.o mi-cmd-symbol.o > SUBDIR_MI_SRCS = \ > mi/mi-out.c mi/mi-console.c \ > mi/mi-cmds.c \ > mi/mi-cmd-var.c mi/mi-cmd-break.c mi/mi-cmd-stack.c \ > - mi/mi-cmd-disas.c \ > + mi/mi-cmd-disas.c mi/mi-cmd-symbol.c \ > mi/mi-main.c mi/mi-parse.c mi/mi-getopt.c > SUBDIR_MI_DEPS = > SUBDIR_MI_INITS = \ > @@ -2411,6 +2411,10 @@ > # Need to explicitly specify the compile rule as make will do nothing > # or try to compile the object file into the mi directory. > > +mi-cmd-symbol.o: $(srcdir)/mi/mi-cmd-symbol.c $(defs_h) $(mi_cmds_h) \ > + $(ui_out_h) $(mi_out_h) $(breakpoint_h) $(gdb_string_h) \ > + $(mi_getopt_h) $(gdb_events_h) $(gdb_h) > + $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-cmd-symbol.c > mi-cmd-break.o: $(srcdir)/mi/mi-cmd-break.c $(defs_h) $(mi_cmds_h) \ > $(ui_out_h) $(mi_out_h) $(breakpoint_h) $(gdb_string_h) \ > $(mi_getopt_h) $(gdb_events_h) $(gdb_h) > diff -r -u gdb+dejagnu-20020907/gdb/mi/gdbmi.texinfo gdb-jelmer/gdb/mi/gdbmi.texinfo > --- gdb+dejagnu-20020907/gdb/mi/gdbmi.texinfo 2002-06-17 19:30:57.000000000 +0200 > +++ gdb-jelmer/gdb/mi/gdbmi.texinfo 2002-09-25 20:07:32.000000000 +0200 > @@ -97,8 +97,8 @@ > > @heading Acknowledgments > > -In alphabetic order: Andrew Cagney, Fernando Nasser, Stan Shebs and > -Elena Zannoni. > +In alphabetic order: Andrew Cagney, Fernando Nasser, Stan Shebs, > +Jelmer Vernooij and Elena Zannoni. > > @menu > * GDB/MI Command Syntax:: > @@ -355,7 +355,7 @@ > the output received from @sc{gdb/mi}. > > @subsubheading Target Stop > -@c Ummm... There is no "-stop" command. This assumes async, no? > +@c Ummm... There is no "-stop" command. This assumes async, no? > Here's an example of stopping the inferior process: > > @example > @@ -2366,10 +2366,12 @@ > used without arguments, clears @value{GDBN}'s symbol table info. No output is > produced, except for a completion notification. > > + > @subsubheading @value{GDBN} Command > > The corresponding @value{GDBN} command is @samp{symbol-file}. > > + > @subsubheading Example > > @smallexample > @@ -2858,13 +2860,19 @@ > > Describe where @var{symbol} is stored. > > + > @subsubheading @value{GDBN} Command > > The corresponding @value{GDBN} command is @samp{info address}. > > -@subsubheading Example > -N.A. > > +@subsubheading Example > +@smallexample > +(@value{GDBP}) > +-symbol-info-address main > +^done,symbol=@{file="bla.c",line="16",name="main",address="0x0804842c"@} > +(@value{GDBP}) > +@end smallexample > > @subheading The @code{-symbol-info-file} Command > @findex -symbol-info-file > @@ -2872,19 +2880,25 @@ > @subsubheading Synopsis > > @example > - -symbol-info-file > + -symbol-info-file @var{file} > @end example > > -Show the file for the symbol. > +Show the full path to the source file @var{file}. > + > > @subsubheading @value{GDBN} Command > > There's no equivalent @value{GDBN} command. @code{gdbtk} has > @samp{gdb_find_file}. > > -@subsubheading Example > -N.A. > > +@subsubheading Example > +@smallexample > +(@value{GDBP}) > +-symbol-info-file bla.c > +^done,file="/home/jelmer/bla.c" > +(@value{GDBP}) > +@end smallexample > > @subheading The @code{-symbol-info-function} Command > @findex -symbol-info-function > @@ -2892,18 +2906,24 @@ > @subsubheading Synopsis > > @example > - -symbol-info-function > + -symbol-info-function @var{symbol} > @end example > > -Show which function the symbol lives in. > +Show which function the @var{symbol} lives in. > + > > @subsubheading @value{GDBN} Command > > @samp{gdb_get_function} in @code{gdbtk}. > > -@subsubheading Example > -N.A. > > +@subsubheading Example > +@smallexample > +(@value{GDBP}) > +-symbol-info-function *0x0804842d > +^done,function="main" > +(@value{GDBP}) > +@end smallexample > > @subheading The @code{-symbol-info-line} Command > @findex -symbol-info-line > @@ -2911,19 +2931,25 @@ > @subsubheading Synopsis > > @example > - -symbol-info-line > + -symbol-info-line @var{symbol} > @end example > > -Show the core addresses of the code for a source line. > +Show the line and file that contains @var{symbol} > + > > @subsubheading @value{GDBN} Command > > The corresponding @value{GDBN} comamnd is @samp{info line}. > @code{gdbtk} has the @samp{gdb_get_line} and @samp{gdb_get_file} commands. > > -@subsubheading Example > -N.A. > > +@subsubheading Example > +@smallexample > +(@value{GDBP}) > +-symbol-info-line main > +^done,line="17",file="bla.c" > +(@value{GDBP}) > +@end smallexample > > @subheading The @code{-symbol-info-symbol} Command > @findex -symbol-info-symbol > @@ -2931,18 +2957,24 @@ > @subsubheading Synopsis > > @example > - -symbol-info-symbol @var{addr} > + -symbol-info-symbol @var{symbol} > @end example > > -Describe what symbol is at location @var{addr}. > +Give details about @var{symbol}. > + > > @subsubheading @value{GDBN} Command > > The corresponding @value{GDBN} command is @samp{info symbol}. > > -@subsubheading Example > -N.A. > > +@subsubheading Example > +@smallexample > +(@value{GDBP}) > +-symbol-info-symbol function_a > +^done,symbol=@{file="bla.c",line="6",name="function_a",address="0x080483f0"@} > +(@value{GDBP}) > +@end smallexample > > @subheading The @code{-symbol-list-functions} Command > @findex -symbol-list-functions > @@ -2950,19 +2982,27 @@ > @subsubheading Synopsis > > @example > - -symbol-list-functions > + -symbol-list-functions @var{pattern} > @end example > > -List the functions in the executable. > +List functions in the executable. If @var{pattern} is specified, > +list all functions that match @var{pattern}; otherwise, list > +all functions. > + > > @subsubheading @value{GDBN} Command > > @samp{info functions} in @value{GDBN}, @samp{gdb_listfunc} and > @samp{gdb_search} in @code{gdbtk}. > > -@subsubheading Example > -N.A. > > +@subsubheading Example > +@smallexample > +(@value{GDBP}) > +-symbol-list-functions funct.* > +^done,symbols=[symbol=@{file="./gdb.mi/symbol.c",line="14",name="function_a",address="0x080483d0"@},symbol=@{file="./gdb.mi/symbol.c",line="19",name="function_b",address="0x080483dc"@}] > +(@value{GDBP}) > +@end smallexample > > @subheading The @code{-symbol-list-types} Command > @findex -symbol-list-types > @@ -2970,10 +3010,13 @@ > @subsubheading Synopsis > > @example > - -symbol-list-types > + -symbol-list-types @var{pattern} > @end example > > -List all the type names. > +List type names. If @var{pattern} is specified, > +list all types that match @var{pattern}; otherwise, list > +all types. > + > > @subsubheading @value{GDBN} Command > > @@ -2981,7 +3024,12 @@ > @samp{gdb_search} in @code{gdbtk}. > > @subsubheading Example > -N.A. > +@smallexample > +(@value{GDBP}) > +-symbol-list-types .*int$ > +^done,symbols=[symbol=@{file="./gdb.mi/symbol.c",line="0",name="complex int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="long int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="long long int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="long long unsigned int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="long unsigned int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="short int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="short unsigned int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="unsigned int"@}] > +(@value{GDBP}) > +@end smallexample > > > @subheading The @code{-symbol-list-variables} Command > @@ -2990,18 +3038,26 @@ > @subsubheading Synopsis > > @example > - -symbol-list-variables > + -symbol-list-variables @var{pattern} > @end example > > -List all the global and static variable names. > +List global and static variable names. If @var{pattern} is specified, > +list all variables that match @var{pattern}; otherwise, list > +all variables. > + > > @subsubheading @value{GDBN} Command > > @samp{info variables} in @value{GDBN}, @samp{gdb_search} in @code{gdbtk}. > > -@subsubheading Example > -N.A. > > +@subsubheading Example > +@smallexample > +(@value{GDBP}) > +-symbol-list-variables glob > +^done,symbols=[symbol=@{file="./gdb.mi/symbol.c",line="23",name="global_a"@},symbol=@{file="./gdb.mi/symbol.c",line="23",name="global_b"@},symbol=@{file="./gdb.mi/symbol.c",line="24",name="global_c"@},symbol=@{file="./gdb.mi/symbol.c",line="25",name="global_d"@}] > +(@value{GDBP}) > +@end smallexample > > @subheading The @code{-symbol-locate} Command > @findex -symbol-locate > @@ -3009,16 +3065,24 @@ > @subsubheading Synopsis > > @example > - -symbol-locate > + -symbol-locate @var{symbol} > @end example > > +Show details for @var{symbol} > + > + > @subsubheading @value{GDBN} Command > > @samp{gdb_loc} in @code{gdbtk}. > > -@subsubheading Example > -N.A. > > +@subsubheading Example > +@smallexample > +(@value{GDBP}) > +-symbol-locate function_b > +^done,symbol=@{file="./gdb.mi/symbol.c",line="19",name="function_b",address="0x080483dc"@} > +(@value{GDBP}) > +@end smallexample > > @subheading The @code{-symbol-type} Command > @findex -symbol-type > @@ -3031,6 +3095,7 @@ > > Show type of @var{variable}. > > + > @subsubheading @value{GDBN} Command > > The corresponding @value{GDBN} command is @samp{ptype}, @code{gdbtk} has > @@ -3056,13 +3121,19 @@ > > Attach to a process @var{pid} or a file @var{file} outside of @value{GDBN}. > > + > @subsubheading @value{GDBN} command > > The corresponding @value{GDBN} command is @samp{attach}. > > -@subsubheading Example > -N.A. > > +@subsubheading Example > +@smallexample > +(@value{GDBP}) > +-target-attach 20666 > +^done,thread-id="0",frame=@{addr="0x400bc991",func="nanosleep",args=[],from="/lib/libc.so.6"@} > +(@value{GDBP}) > +@end smallexample > > @subheading The @code{-target-compare-sections} Command > @findex -target-compare-sections > diff -r -u gdb+dejagnu-20020907/gdb/mi/mi-cmds.c gdb-jelmer/gdb/mi/mi-cmds.c > --- gdb+dejagnu-20020907/gdb/mi/mi-cmds.c 2001-03-06 09:21:45.000000000 +0100 > +++ gdb-jelmer/gdb/mi/mi-cmds.c 2002-09-13 21:48:08.000000000 +0200 > @@ -109,17 +109,17 @@ > {"stack-list-frames", 0, 0, mi_cmd_stack_list_frames}, > {"stack-list-locals", 0, 0, mi_cmd_stack_list_locals}, > {"stack-select-frame", 0, 0, mi_cmd_stack_select_frame}, > - {"symbol-info-address", 0, 0}, > - {"symbol-info-file", 0, 0}, > - {"symbol-info-function", 0, 0}, > - {"symbol-info-line", 0, 0}, > - {"symbol-info-symbol", 0, 0}, > - {"symbol-list-functions", 0, 0}, > - {"symbol-list-types", 0, 0}, > - {"symbol-list-variables", 0, 0}, > - {"symbol-locate", 0, 0}, > + {"symbol-info-address", 0, 0, mi_cmd_symbol_locate}, > + {"symbol-info-file", 0, 0, mi_cmd_symbol_info_file}, > + {"symbol-info-function", 0, 0, mi_cmd_symbol_info_function}, > + {"symbol-info-line", 0, 0, mi_cmd_symbol_info_line}, > + {"symbol-info-symbol", 0, 0, mi_cmd_symbol_locate}, If there are several commands that map to the same function, then the interface needs a redesign. However I think that the initial intent of these commands was to have them print different things. It is a bit hard to implement commands w/o having a clear idea of how the GUI will end up using them. The initial idea was that the symbol-info-address would take a symbol name as argument, and print information about his location, while symbol-info-symbol would take an address as argument and print the name of the symbol located at that address. symbol-locate would instead return the "source code" location of a symbol. It is similar to a function that gdbtk uses to recenter the source window around the current PC, for instance. > + {"symbol-list-functions", 0, 0, mi_cmd_symbol_list_symbols}, > + {"symbol-list-types", 0, 0, mi_cmd_symbol_list_symbols}, > + {"symbol-list-variables", 0, 0, mi_cmd_symbol_list_symbols}, I would prefer if these 3 command map to 3 different wrapper functions, instead of trying to decide the behavior based on the command used, you could set up a variable, and pass that into the main worker function. > + {"symbol-locate", 0, 0, mi_cmd_symbol_locate}, See comment above. > {"symbol-type", 0, 0}, > - {"target-attach", 0, 0}, > + {"target-attach", "attach %s", 0}, Sorry, no. It is not that simple, see the thread: http://sources.redhat.com/ml/gdb-patches/2002-10/msg00288.html > {"target-compare-sections", 0, 0}, > {"target-detach", "detach", 0}, > {"target-download", 0, mi_cmd_target_download}, > diff -r -u gdb+dejagnu-20020907/gdb/mi/mi-cmds.h gdb-jelmer/gdb/mi/mi-cmds.h > --- gdb+dejagnu-20020907/gdb/mi/mi-cmds.h 2001-03-06 09:21:45.000000000 +0100 > +++ gdb-jelmer/gdb/mi/mi-cmds.h 2002-09-13 21:33:47.000000000 +0200 > @@ -75,6 +75,12 @@ > extern mi_cmd_args_ftype mi_cmd_exec_until; > extern mi_cmd_args_ftype mi_cmd_exec_interrupt; > extern mi_cmd_argv_ftype mi_cmd_gdb_exit; > +extern mi_cmd_argv_ftype mi_cmd_symbol_info_file; > +extern mi_cmd_argv_ftype mi_cmd_symbol_info_function; > +extern mi_cmd_argv_ftype mi_cmd_symbol_info_line; > +extern mi_cmd_argv_ftype mi_cmd_symbol_info_symbol; > +extern mi_cmd_argv_ftype mi_cmd_symbol_list_symbols; > +extern mi_cmd_argv_ftype mi_cmd_symbol_locate; > extern mi_cmd_argv_ftype mi_cmd_stack_info_depth; > extern mi_cmd_argv_ftype mi_cmd_stack_list_args; > extern mi_cmd_argv_ftype mi_cmd_stack_list_frames; > --- /dev/null 2002-08-29 13:57:56.000000000 +0200 > +++ gdb-jelmer/gdb/mi/mi-cmd-symbol.c 2002-09-17 18:29:39.000000000 +0200 > @@ -0,0 +1,222 @@ > +/* MI Command Set - symbol query commands. > + Copyright 2000, 2002 Free Software Foundation, Inc. > + Contributed by Jelmer Vernooij > + > + This file is part of GDB. > + > + This program 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 2 of the License, or > + (at your option) any later version. > + > + This program 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 this program; if not, write to the Free Software > + Foundation, Inc., 59 Temple Place - Suite 330, > + Boston, MA 02111-1307, USA. */ > + > +#include "defs.h" > +#include "target.h" > +#include "frame.h" > +#include "value.h" > +#include "mi-cmds.h" > +#include "ui-out.h" > +#include "symtab.h" > +#include "linespec.h" > + > +static void > +print_symbol_info (struct symtab *symtab, struct symbol *sym, > + struct minimal_symbol *msym) > +{ > + /* Strip off some C++ special symbols, like RTTI and global > + * constructors/destructors. */ > + if ((sym != NULL && !STREQN (SYMBOL_NAME (sym), "__tf", 4) > + && !STREQN (SYMBOL_NAME (sym), "_GLOBAL_", 8)) || msym != NULL) > + { > + > + ui_out_tuple_begin (uiout, "symbol"); > + if (sym) > + { > + if (symtab->filename) > + ui_out_field_string (uiout, "file", symtab->filename); > + ui_out_field_int (uiout, "line", SYMBOL_LINE (sym)); > + ui_out_field_string (uiout, "name", SYMBOL_SOURCE_NAME (sym)); > + if (SYMBOL_CLASS (sym) == LOC_BLOCK) > + ui_out_field_core_addr (uiout, "address", > + SYMBOL_BLOCK_VALUE (sym)->startaddr); > + } > + else if (msym) > + { > + ui_out_field_string (uiout, "name", SYMBOL_SOURCE_NAME (msym)); > + ui_out_field_core_addr (uiout, "address", > + SYMBOL_VALUE_ADDRESS (msym)); > + } > + ui_out_tuple_end (uiout); > + } > +} > + > +enum mi_cmd_result > +mi_cmd_symbol_info_line (char *command, char **argv, int argc) > +{ > + struct symtabs_and_lines sals; > + struct cleanup *old_chain; > + char *args, **canonical; > + > + if (argc != 1) > + error ("mi_cmd_symbol_info_line: Usage: SYMBOL"); > + > + args = argv[0]; > + > + sals = decode_line_1 (&args, 1, NULL, 0, &canonical); > + > + old_chain = make_cleanup (xfree, sals.sals); > + > + if (sals.nelts == 1) > + { > + ui_out_field_int (uiout, "line", sals.sals[0].line); > + ui_out_field_string (uiout, "file", sals.sals[0].symtab->filename); > + return MI_CMD_DONE; > + } > + > + do_cleanups(old_chain); > + > + error ("mi_cmd_symbol_info_line: No such symbol"); > + > + return MI_CMD_DONE; > +} > + Info_line should return the core addr ranges for a given line number. You instead have implemented a different behavior: given a line number name, print the line number which we just gave as input, and the file name. Also in the usage and error messages, the use of the word 'symbol' is a bit inappropriate, because the argument of the command is not a symbol name. > +enum mi_cmd_result > +mi_cmd_symbol_locate (char *command, char **argv, int argc) > +{ > + struct symtabs_and_lines sals; > + struct symbol *sym; > + struct minimal_symbol *msym; > + struct cleanup *old_chain; > + > + if (argc != 1) > + error ("mi_cmd_symbol_locate: Usage: SYMBOL"); > + > + sals = decode_line_spec (argv[0], 1); > + old_chain = make_cleanup( xfree, sals.sals); > + > + if (sals.nelts != 1) > + error ("mi_cmd_symbol_locate: No such symbol"); > + > + resolve_sal_pc (&sals.sals[0]); > + > + sym = find_pc_function (sals.sals[0].pc); > + msym = lookup_minimal_symbol_by_pc (sals.sals[0].pc); > + > + print_symbol_info (sals.sals[0].symtab, sym, msym); > + > + do_cleanups(old_chain); > + > + return MI_CMD_DONE; > +} > + > +enum mi_cmd_result > +mi_cmd_symbol_info_file (char *command, char **argv, int argc) > +{ > + struct symtab *st; > + char *fullname; > + > + if (argc != 1) > + error ("mi_cmd_symbol_info_file: Usage: FILE"); > + No, the argument is a symbol, it returns the file name. > + st = lookup_symtab (argv[0]); > + this is wrong also, argv[0] is a symbol name, not a filename. > + if (!st) > + error ("mi_cmd_symbol_info_file: No such source file"); > + > + if (st->fullname) > + ui_out_field_string (uiout, "file", st->fullname); > + else > + ui_out_field_string (uiout, "file", symtab_to_filename (st)); > + > + return MI_CMD_DONE; > +} > + > +enum mi_cmd_result > +mi_cmd_symbol_info_function (char *command, char **argv, int argc) > +{ > + char *function = ""; > + struct symtabs_and_lines sals; > + struct symbol *sym; > + struct minimal_symbol *msym; > + struct cleanup *old_chain; > + char *args, **canonical; > + > + if (argc != 1) > + error ("mi_cmd_symbol_info_function: Usage: SYMBOL"); > + > + args = argv[0]; > + > + sals = decode_line_1 (&args, 1, NULL, 0, &canonical); this one could be ok, but there is contradictory information in the current documentation. It was documented as taking a symbol and returning the function where the symbol is in, however it suggest that it should provide the functionality that a gdbtk function provides. That gdbtk function however takes a linespec as argument. I think this mi command needs to be revisited. So, wait until the issue is cleared. > + old_chain = make_cleanup( xfree, sals.sals); > + > + if (sals.nelts == 1) > + { > + resolve_sal_pc (&sals.sals[0]); > + /* Try 'normal' symbol first */ > + if ((sym = find_pc_function (sals.sals[0].pc))) > + { > + function = SYMBOL_SOURCE_NAME (sym); > + } > + else if ((msym = lookup_minimal_symbol_by_pc (sals.sals[0].pc))) > + { > + function = SYMBOL_SOURCE_NAME (msym); > + } > + > + ui_out_field_string (uiout, "function", function); > + return MI_CMD_DONE; > + } > + do_cleanups(old_chain); > + > + error ("mi_cmd_symbol_info_function: No such symbol"); > + return MI_CMD_DONE; > +} > + > +enum mi_cmd_result > +mi_cmd_symbol_list_symbols (char *command, char **argv, int argc) > +{ > + struct symbol_search *matches; > + struct symbol_search *p; > + struct cleanup *old_chain = NULL; > + namespace_enum space = 0; > + char *function_name; > + if (argc > 1) > + error ("%s: Usage: [FUNCTION]", command); > + > + if (strcmp (command, "symbol-list-functions") == 0) > + space = FUNCTIONS_NAMESPACE; > + else if (strcmp (command, "symbol-list-types") == 0) > + space = TYPES_NAMESPACE; > + else if (strcmp (command, "symbol-list-variables") == 0) > + space = VARIABLES_NAMESPACE; > + else > + error ("mi_cmd_symbol_list_symbols: Called for illegal command %s!", > + command); > + > + search_symbols (argv[0], space, 0, NULL, &matches); > + > + if (matches != NULL) > + old_chain = make_cleanup_free_search_symbols (matches); > + > + ui_out_list_begin (uiout, "symbols"); > + > + for (p = matches; p; p = p->next) > + { > + print_symbol_info (p->symtab, p->symbol, p->msymbol); > + } > + I am not sure that this implementation is really useful. I tried a 'info symbols' for a simple program, and it returned every symbol that is included in the executable, i.e. a very very long list. gdbtk has changed this to search for the symbols in a given file. Again, this is probably something that should be revisited for the interface. Unless we force a regexp as argument, but I don't really know what would be more useful for a GUI. > + ui_out_list_end (uiout); > + > + if (matches) > + do_cleanups (old_chain); > + > + return MI_CMD_DONE; > +} Elena