diff options
author | Pedro Alves <pedro@palves.net> | 2023-02-08 16:06:23 +0000 |
---|---|---|
committer | Pedro Alves <pedro@palves.net> | 2023-02-15 20:58:00 +0000 |
commit | 91265a7d7cddc10314335ffcfbfae7159c7cecb1 (patch) | |
tree | 3449a623ebe58d5e59ea3c72eb9be336cc0dbc03 /gdb/testsuite | |
parent | 751495be92b2b319fb66ce4e12b562a0e27c15fe (diff) | |
download | gdb-91265a7d7cddc10314335ffcfbfae7159c7cecb1.zip gdb-91265a7d7cddc10314335ffcfbfae7159c7cecb1.tar.gz gdb-91265a7d7cddc10314335ffcfbfae7159c7cecb1.tar.bz2 |
Add new "$_shell(CMD)" internal function
For testing a following patch, I wanted a way to send a SIGINT to GDB
from a breakpoint condition. And I didn't want to do it from a Python
breakpoint or Python function, as I wanted to exercise non-Python code
paths. So I thought I'd add a new $_shell internal function, that
runs a command under the shell, and returns the exit code. With this,
I could write:
(gdb) b foo if $_shell("kill -SIGINT $gdb_pid") != 0 || <other condition>
I think this is generally useful, hence I'm proposing it here.
Here's the new function in action:
(gdb) p $_shell("true")
$1 = 0
(gdb) p $_shell("false")
$2 = 1
(gdb) p $_shell("echo hello")
hello
$3 = 0
(gdb) p $_shell("foobar")
bash: line 1: foobar: command not found
$4 = 127
(gdb) help function _shell
$_shell - execute a shell command and returns the result.
Usage: $_shell (command)
Returns the command's exit code: zero on success, non-zero otherwise.
(gdb)
NEWS and manual changes included.
Approved-By: Andrew Burgess <aburgess@redhat.com>
Approved-By: Tom Tromey <tom@tromey.com>
Approved-By: Eli Zaretskii <eliz@gnu.org>
Change-Id: I7e36d451ee6b428cbf41fded415ae2d6b4efaa4e
Diffstat (limited to 'gdb/testsuite')
-rw-r--r-- | gdb/testsuite/gdb.base/default.exp | 1 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/shell.exp | 36 |
2 files changed, 37 insertions, 0 deletions
diff --git a/gdb/testsuite/gdb.base/default.exp b/gdb/testsuite/gdb.base/default.exp index d0789a6..7e73db0 100644 --- a/gdb/testsuite/gdb.base/default.exp +++ b/gdb/testsuite/gdb.base/default.exp @@ -606,6 +606,7 @@ set show_conv_list \ {$_cimag = <internal function _cimag>} \ {$_creal = <internal function _creal>} \ {$_isvoid = <internal function _isvoid>} \ + {$_shell = <internal function _shell>} \ {$_gdb_maint_setting_str = <internal function _gdb_maint_setting_str>} \ {$_gdb_maint_setting = <internal function _gdb_maint_setting>} \ {$_gdb_setting_str = <internal function _gdb_setting_str>} \ diff --git a/gdb/testsuite/gdb.base/shell.exp b/gdb/testsuite/gdb.base/shell.exp index 31cdcb4..ba1691e 100644 --- a/gdb/testsuite/gdb.base/shell.exp +++ b/gdb/testsuite/gdb.base/shell.exp @@ -41,6 +41,42 @@ if { ! [ishost *-*-mingw*] } { gdb_test "p \$_shell_exitsignal" " = 2" "shell interrupt exitsignal" } +# Test the $_shell convenience function. + +with_test_prefix "\$_shell convenience function" { + # Simple commands, check the result code. + gdb_test "p \$_shell(\"true\")" " = 0" + gdb_test "p \$_shell(\"false\")" " = 1" + + # Test command with arguments. + gdb_test "p \$_shell(\"echo foo\")" "foo\r\n\\$${decimal} = 0" + + # Check the type of the result. + gdb_test "ptype \$_shell(\"true\")" "type = int" + + # Test passing a non-literal string as command name. + gdb_test "p \$cmd = \"echo bar\"" " = \"echo bar\"" + gdb_test "p \$_shell(\$cmd)" "bar\r\n\\$${decimal} = 0" + + # Test executing a non-existing command. The result is + # shell-dependent, but most (all?) POSIX-like shells return 127 in + # this case. + gdb_test "p \$_shell(\"non-existing-command-foo-bar-qux\")" " = 127" + + gdb_test "p \$_shell" \ + " = <internal function _shell>" + gdb_test "ptype \$_shell" \ + "type = <internal function>" + + # Test error scenarios. + gdb_test "p \$_shell()" \ + "You must provide one argument for \\\$_shell\\\." + gdb_test "p \$_shell(\"a\", \"b\")" \ + "You must provide one argument for \\\$_shell\\\." + gdb_test "p \$_shell(1)" \ + "Argument must be a string\\\." +} + # Define the user command "foo", used to test "pipe" command. gdb_test_multiple "define foo" "define foo" { -re "End with" { |