Re: [PATCH 3/3] gdb/mi: Add new commands -symbol-info-{functions,variables,types}

Simon Marchi
2019-10-04T03:01:19Z

On 2019-09-26 7:09 p.m., Andrew Burgess wrote:
> Add new MI commands -symbol-info-functions, -symbol-info-variables,
> and -symbol-info-types which correspond to the CLI commands 'info
> functions', 'info variables', and 'info types' respectively.

Hi Andrew,

The first thing I tried was to run it on GDB itself and run "-symbol-info-functions"
by itself. Apparently, it tries to list all functions in the program :). I think
we need to be careful with that, as it would be really easy for a debug session to
become unresponsive. Imagine an IDE that has a little box to search symbols by name.
The user while debugging a big program, types "e<enter>", which generates this
MI command:

-symbol-info-functions --name "e"

This would essentially hang the debug session while GDB expands all the symtabs with
at least a function with "e" in its name. It would take a huge amount of time and
memory. I don't know how easy it would be to implement, but for these cases, a
"--max-results N" switch, which would stop the search early, might useful.

Note that the same happens if you type "info functions" in the CLI. But at least,
when using the CLI interactively, you can ctrl-C, which front-ends don't typically
do.

Also, since this output is meant to be consumed by a front-end, it would be
interesting to have the details of the symbols in separate fields. For example,
for variables, have the type and name in separate fields. This gives front-ends
more freedom on how to display them.

For functions, I would even see (maybe not in this patch though) a list of parameters
with their names and types.

Of course, we can always start with something basic and add fields as we go.

I didn't really look at the implementation, since it's getting a bit late, but:

> diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h
> index 91ce4cd4070..5fa4fafbb05 100644
> --- a/gdb/mi/mi-cmds.h
> +++ b/gdb/mi/mi-cmds.h
> @@ -94,6 +94,9 @@ extern mi_cmd_argv_ftype mi_cmd_stack_list_locals;
> extern mi_cmd_argv_ftype mi_cmd_stack_list_variables;
> extern mi_cmd_argv_ftype mi_cmd_stack_select_frame;
> extern mi_cmd_argv_ftype mi_cmd_symbol_list_lines;
> +extern mi_cmd_argv_ftype mi_cmd_symbol_info_functions;
> +extern mi_cmd_argv_ftype mi_cmd_symbol_info_variables;
> +extern mi_cmd_argv_ftype mi_cmd_symbol_info_types;

The last two are not in alphabetical order (in the .c as well).

Simon