Bug 11920

Summary: tab completion might stall cli without any feedback
Product: gdb Reporter: Mark Wielaard <mark>
Component: cliAssignee: Not yet assigned to anyone <unassigned>
Status: RESOLVED FIXED    
Severity: normal CC: dmalcolm, gbenson, gdb-prs, maayan, xdje42
Priority: P2    
Version: archer   
Target Milestone: 7.1   
Host: Target:
Build: Last reconfirmed: 2014-02-12 00:00:00

Description Mark Wielaard 2010-08-17 20:10:06 UTC
When one presses <tab> at the "wrong" time it can feel like gdb stalls. It would
be nice if gdb gave some feedback it is doing lots of lookups.

Example from a c++ program:

(gdb) break std::<tab>
[...nothing for about 3 seconds - not obviously killable...]
Display all 14472 possibilities? (y or n)
Comment 1 Gary Benson 2013-11-04 13:02:29 UTC
See also bug 15548.
Comment 2 Maayan Keshet 2014-09-21 08:54:08 UTC
Maybe it's difficult to resolve thoroughly, as the problem is the amount of symbol tables and not amount of symbols (so it can happen with vastly varying amount of symbols).

But for the meantime, can we have an option to disable the tab completion when the inputted prefix is < $SOME_NUM? e.g. if I enter the command "noshorttab" and do "b foo<tab>" nothing will happen.
Comment 3 Sourceware Commits 2015-01-31 23:15:07 UTC
The master branch has been updated by Doug Evans <devans@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=ef0b411a110cd2602cb89c3fb237baf8beb28545

commit ef0b411a110cd2602cb89c3fb237baf8beb28545
Author: Gary Benson <gbenson@redhat.com>
Date:   Sat Jan 31 15:07:22 2015 -0800

    Add max-completions parameter, and implement tab-completion limiting.
    
    This commit adds a new exception, MAX_COMPLETIONS_REACHED_ERROR, to be
    thrown whenever the completer has generated too many candidates to
    be useful.  A new user-settable variable, "max_completions", is added
    to control this behaviour.  A top-level completion limit is added to
    complete_line_internal, as the final check to ensure the user never
    sees too many completions.  An additional limit is added to
    default_make_symbol_completion_list_break_on, to halt time-consuming
    symbol table expansions.
    
    gdb/ChangeLog:
    
    	PR cli/9007
    	PR cli/11920
    	PR cli/15548
    	* cli/cli-cmds.c (complete_command): Notify user if max-completions
    	reached.
    	* common/common-exceptions.h (enum errors)
    	<MAX_COMPLETIONS_REACHED_ERROR>: New value.
    	* completer.h (get_max_completions_reached_message): New declaration.
    	(max_completions): Likewise.
    	(completion_tracker_t): New typedef.
    	(new_completion_tracker): New declaration.
    	(make_cleanup_free_completion_tracker): Likewise.
    	(maybe_add_completion_enum): New enum.
    	(maybe_add_completion): New declaration.
    	(throw_max_completions_reached_error): Likewise.
    	* completer.c (max_completions): New global variable.
    	(new_completion_tracker): New function.
    	(free_completion_tracker): Likewise.
    	(make_cleanup_free_completion_tracker): Likewise.
    	(maybe_add_completions): Likewise.
    	(throw_max_completions_reached_error): Likewise.
    	(complete_line): Remove duplicates and limit result to max_completions
    	entries.
    	(get_max_completions_reached_message): New function.
    	(gdb_display_match_list): Handle max_completions.
    	(_initialize_completer): New declaration and function.
    	* symtab.c: Include completer.h.
    	(completion_tracker): New static variable.
    	(completion_list_add_name): Call maybe_add_completion.
    	(default_make_symbol_completion_list_break_on_1): Renamed from
    	default_make_symbol_completion_list_break_on.  Maintain
    	completion_tracker across calls to completion_list_add_name.
    	(default_make_symbol_completion_list_break_on): New function.
    	* top.c (init_main): Set rl_completion_display_matches_hook.
    	* tui/tui-io.c: Include completer.h.
    	(tui_old_rl_display_matches_hook): New static global.
    	(tui_rl_display_match_list): Notify user if max-completions reached.
    	(tui_setup_io): Save/restore rl_completion_display_matches_hook.
    	* NEWS (New Options): Mention set/show max-completions.
    
    gdb/doc/ChangeLog:
    
    	* gdb.texinfo (Command Completion): Document new
    	"set/show max-completions" option.
    
    gdb/testsuite/ChangeLog:
    
    	* gdb.base/completion.exp: Disable completion limiting for
    	existing tests.  Add new tests to check completion limiting.
    	* gdb.linespec/ls-errs.exp: Disable completion limiting.
Comment 4 Sourceware Commits 2015-01-31 23:27:03 UTC
The master branch has been updated by Doug Evans <devans@sourceware.org>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=cfb069a8bebfacaf00dee6446e86a856978670be

commit cfb069a8bebfacaf00dee6446e86a856978670be
Author: Gary Benson <gbenson@redhat.com>
Date:   Sat Jan 31 15:24:26 2015 -0800

    ChangeLog entries for max-completions patch.
    
    gdb/ChangeLog:
    
    	PR cli/9007
    	PR cli/11920
    	PR cli/15548
    	* cli/cli-cmds.c (complete_command): Notify user if max-completions
    	reached.
    	* common/common-exceptions.h (enum errors)
    	<MAX_COMPLETIONS_REACHED_ERROR>: New value.
    	* completer.h (get_max_completions_reached_message): New declaration.
    	(max_completions): Likewise.
    	(completion_tracker_t): New typedef.
    	(new_completion_tracker): New declaration.
    	(make_cleanup_free_completion_tracker): Likewise.
    	(maybe_add_completion_enum): New enum.
    	(maybe_add_completion): New declaration.
    	(throw_max_completions_reached_error): Likewise.
    	* completer.c (max_completions): New global variable.
    	(new_completion_tracker): New function.
    	(free_completion_tracker): Likewise.
    	(make_cleanup_free_completion_tracker): Likewise.
    	(maybe_add_completions): Likewise.
    	(throw_max_completions_reached_error): Likewise.
    	(complete_line): Remove duplicates and limit result to max_completions
    	entries.
    	(get_max_completions_reached_message): New function.
    	(gdb_display_match_list): Handle max_completions.
    	(_initialize_completer): New declaration and function.
    	* symtab.c: Include completer.h.
    	(completion_tracker): New static variable.
    	(completion_list_add_name): Call maybe_add_completion.
    	(default_make_symbol_completion_list_break_on_1): Renamed from
    	default_make_symbol_completion_list_break_on.  Maintain
    	completion_tracker across calls to completion_list_add_name.
    	(default_make_symbol_completion_list_break_on): New function.
    	* top.c (init_main): Set rl_completion_display_matches_hook.
    	* tui/tui-io.c: Include completer.h.
    	(tui_old_rl_display_matches_hook): New static global.
    	(tui_rl_display_match_list): Notify user if max-completions reached.
    	(tui_setup_io): Save/restore rl_completion_display_matches_hook.
    	* NEWS (New Options): Mention set/show max-completions.
    
    gdb/doc/ChangeLog:
    
    	* gdb.texinfo (Command Completion): Document new
    	"set/show max-completions" option.
    
    gdb/testsuite/ChangeLog:
    
    	* gdb.base/completion.exp: Disable completion limiting for
    	existing tests.  Add new tests to check completion limiting.
    	* gdb.linespec/ls-errs.exp: Disable completion limiting.
Comment 5 Doug Evans 2015-03-28 22:08:32 UTC
Patch committed.