a9f116cbf2
have empty bodies. User-defined commands that have empty bodies weren't being shown because the print function returned too soon. Now, it prints the command's name before checking if it has any body at all. This also fixes the same problem on "show user <myemptycommand>", which wasn't being printed due to a similar reason. gdb/Changelog: * cli/cli-cmds.c (show_user): Use cli_user_command_p to decide whether we display the command on "show user". * cli/cli-script.c (show_user_1): Only verify cmdlines after printing command name. * cli/cli-decode.h (cli_user_command_p): Declare new function. * cli/cli-decode.c (cli_user_command_p): Create helper function to verify whether cmd_list_element is a user-defined command. gdb/testsuite/Changelog: * gdb.base/commands.exp: Add tests to verify user-defined commands with empty bodies. * gdb.python/py-cmd.exp: Test that we don't show user-defined python commands in `show user command`. * gdb.python/scm-cmd.exp: Test that we don't show user-defined scheme commands in `show user command`.
197 lines
7 KiB
Text
197 lines
7 KiB
Text
# Copyright (C) 2009-2014 Free Software Foundation, Inc.
|
|
|
|
# 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
|
|
# This file is part of the GDB testsuite. It tests the mechanism
|
|
# for defining new GDB commands in Python.
|
|
|
|
load_lib gdb-python.exp
|
|
|
|
standard_testfile
|
|
|
|
if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
|
|
return -1
|
|
}
|
|
|
|
# Skip all tests if Python scripting is not enabled.
|
|
if { [skip_python_tests] } { continue }
|
|
|
|
if ![runto_main] then {
|
|
fail "Cannot run to main."
|
|
return 0
|
|
}
|
|
|
|
# Test a simple command.
|
|
|
|
gdb_py_test_multiple "input simple command" \
|
|
"python" "" \
|
|
"class test_cmd (gdb.Command):" "" \
|
|
" def __init__ (self):" "" \
|
|
" super (test_cmd, self).__init__ (\"test_cmd\", gdb.COMMAND_OBSCURE)" "" \
|
|
" def invoke (self, arg, from_tty):" "" \
|
|
" print (\"test_cmd output, arg = %s\" % arg)" "" \
|
|
"test_cmd ()" "" \
|
|
"end" ""
|
|
|
|
gdb_test "test_cmd ugh" "test_cmd output, arg = ugh" "call simple command"
|
|
|
|
# Test a prefix command, and a subcommand within it.
|
|
|
|
gdb_py_test_multiple "input prefix command" \
|
|
"python" "" \
|
|
"class prefix_cmd (gdb.Command):" "" \
|
|
" def __init__ (self):" "" \
|
|
" super (prefix_cmd, self).__init__ (\"prefix_cmd\", gdb.COMMAND_OBSCURE, gdb.COMPLETE_NONE, True)" "" \
|
|
" def invoke (self, arg, from_tty):" "" \
|
|
" print (\"prefix_cmd output, arg = %s\" % arg)" "" \
|
|
"prefix_cmd ()" "" \
|
|
"end" ""
|
|
|
|
gdb_test "prefix_cmd ugh" "prefix_cmd output, arg = ugh" "call prefix command"
|
|
|
|
gdb_py_test_multiple "input subcommand" \
|
|
"python" "" \
|
|
"class subcmd (gdb.Command):" "" \
|
|
" def __init__ (self):" "" \
|
|
" super (subcmd, self).__init__ (\"prefix_cmd subcmd\", gdb.COMMAND_OBSCURE)" "" \
|
|
" def invoke (self, arg, from_tty):" "" \
|
|
" print (\"subcmd output, arg = %s\" % arg)" "" \
|
|
"subcmd ()" "" \
|
|
"end" ""
|
|
|
|
gdb_test "prefix_cmd subcmd ugh" "subcmd output, arg = ugh" "call subcmd"
|
|
|
|
# Test prefix command using keyword arguments.
|
|
|
|
gdb_py_test_multiple "input prefix command, keyword arguments" \
|
|
"python" "" \
|
|
"class prefix_cmd2 (gdb.Command):" "" \
|
|
" def __init__ (self):" "" \
|
|
" super (prefix_cmd2, self).__init__ (\"prefix_cmd2\", gdb.COMMAND_OBSCURE, prefix = True, completer_class = gdb.COMPLETE_FILENAME)" "" \
|
|
" def invoke (self, arg, from_tty):" "" \
|
|
" print (\"prefix_cmd2 output, arg = %s\" % arg)" "" \
|
|
"prefix_cmd2 ()" "" \
|
|
"end" ""
|
|
|
|
gdb_test "prefix_cmd2 argh" "prefix_cmd2 output, arg = argh" "call prefix command, keyword arguments"
|
|
|
|
gdb_py_test_multiple "input subcommand under prefix_cmd2" \
|
|
"python" "" \
|
|
"class subcmd (gdb.Command):" "" \
|
|
" def __init__ (self):" "" \
|
|
" super (subcmd, self).__init__ (\"prefix_cmd2 subcmd\", gdb.COMMAND_OBSCURE)" "" \
|
|
" def invoke (self, arg, from_tty):" "" \
|
|
" print (\"subcmd output, arg = %s\" % arg)" "" \
|
|
"subcmd ()" "" \
|
|
"end" ""
|
|
|
|
gdb_test "prefix_cmd2 subcmd ugh" "subcmd output, arg = ugh" "call subcmd under prefix_cmd2"
|
|
|
|
# Test a subcommand in an existing GDB prefix.
|
|
|
|
gdb_py_test_multiple "input new subcommand" \
|
|
"python" "" \
|
|
"class newsubcmd (gdb.Command):" "" \
|
|
" def __init__ (self):" "" \
|
|
" super (newsubcmd, self).__init__ (\"info newsubcmd\", gdb.COMMAND_OBSCURE)" "" \
|
|
" def invoke (self, arg, from_tty):" "" \
|
|
" print (\"newsubcmd output, arg = %s\" % arg)" "" \
|
|
"newsubcmd ()" "" \
|
|
"end" ""
|
|
|
|
gdb_test "info newsubcmd ugh" "newsubcmd output, arg = ugh" "call newsubcmd"
|
|
|
|
# Test a command that throws gdb.GdbError.
|
|
|
|
gdb_py_test_multiple "input command to throw error" \
|
|
"python" "" \
|
|
"class test_error_cmd (gdb.Command):" "" \
|
|
" def __init__ (self):" "" \
|
|
" super (test_error_cmd, self).__init__ (\"test_error_cmd\", gdb.COMMAND_OBSCURE)" "" \
|
|
" def invoke (self, arg, from_tty):" "" \
|
|
" raise gdb.GdbError ('you lose!')" "" \
|
|
"test_error_cmd ()" "" \
|
|
"end" ""
|
|
|
|
gdb_test "test_error_cmd ugh" "you lose!" "call error command"
|
|
|
|
# Test gdb.string_to_argv.
|
|
|
|
gdb_test "python print (gdb.string_to_argv (\"1 2 3\"))" \
|
|
{\['1', '2', '3'\]} \
|
|
"string_to_argv (\"1 2 3\")"
|
|
|
|
gdb_test "python print (gdb.string_to_argv (\"'1 2' 3\"))" \
|
|
{\['1 2', '3'\]} \
|
|
"string_to_argv (\"'1 2' 3\")"
|
|
|
|
gdb_test "python print (gdb.string_to_argv ('\"1 2\" 3'))" \
|
|
{\['1 2', '3'\]} \
|
|
"string_to_argv ('\"1 2\" 3')"
|
|
|
|
gdb_test "python print (gdb.string_to_argv ('1\\ 2 3'))" \
|
|
{\['1 2', '3'\]} \
|
|
"string_to_argv ('1\\ 2 3')"
|
|
|
|
# Test user-defined python commands.
|
|
gdb_py_test_multiple "input simple user-defined command" \
|
|
"python" "" \
|
|
"class test_help (gdb.Command):" "" \
|
|
" \"\"\"Docstring\"\"\"" "" \
|
|
" def __init__ (self):" "" \
|
|
" super (test_help, self).__init__ (\"test_help\", gdb.COMMAND_USER)" "" \
|
|
" def invoke (self, arg, from_tty):" "" \
|
|
" print (\"test_cmd output, arg = %s\" % arg)" "" \
|
|
"test_help ()" "" \
|
|
"end" ""
|
|
|
|
gdb_test "test_help ugh" "test_cmd output, arg = ugh" "call simple user-defined command"
|
|
|
|
# Make sure the command shows up in `help user-defined`.
|
|
gdb_test "help user-defined" "User-defined commands.\[\r\n\]+The commands in this class are those defined by the user.\[\r\n\]+Use the \"define\" command to define a command.\[\r\n\]+\[\r\n\]+List of commands:\[\r\n\]+\[\r\n\]+test_help -- Docstring\[\r\n\]+\[\r\n\]+Type \"help\" followed by command name for full documentation.\[\r\n\]+Type \"apropos word\" to search for commands related to \"word\".\[\r\n\]+Command name abbreviations are allowed if unambiguous.\[\r\n\]+" "see user-defined command in `help user-defined`"
|
|
|
|
# Make sure the command does not show up in `show user`.
|
|
gdb_test "show user test_help" "Not a user command\." \
|
|
"don't show user-defined python command in `show user command`"
|
|
|
|
# Test expression completion on fields
|
|
gdb_py_test_multiple "expression completion command" \
|
|
"python" "" \
|
|
"class expr_test (gdb.Command):" "" \
|
|
" def __init__ (self):" "" \
|
|
" super (expr_test, self).__init__ (\"expr_test\", gdb.COMMAND_USER, gdb.COMPLETE_EXPRESSION)" "" \
|
|
" def invoke (self, arg, from_tty):" "" \
|
|
" print (\"invoked on = %s\" % arg)" "" \
|
|
"expr_test ()" "" \
|
|
"end" ""
|
|
|
|
|
|
gdb_test "complete expr_test bar\." \
|
|
"expr_test bar\.bc.*expr_test bar\.ij.*" \
|
|
"Test completion through complete command"
|
|
|
|
if { [readline_is_used] } {
|
|
set test "complete 'expr_test bar.i'"
|
|
send_gdb "expr_test bar\.i\t\t"
|
|
gdb_test_multiple "" "$test" {
|
|
-re "expr_test bar\.ij \\\x07$" {
|
|
send_gdb "\n"
|
|
gdb_test_multiple "" $test {
|
|
-re "invoked on = bar.ij.*$gdb_prompt $" {
|
|
pass "$test"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|