aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite
diff options
context:
space:
mode:
authorPedro Alves <pedro@palves.net>2023-02-08 16:06:23 +0000
committerPedro Alves <pedro@palves.net>2023-02-15 20:58:00 +0000
commit91265a7d7cddc10314335ffcfbfae7159c7cecb1 (patch)
tree3449a623ebe58d5e59ea3c72eb9be336cc0dbc03 /gdb/testsuite
parent751495be92b2b319fb66ce4e12b562a0e27c15fe (diff)
downloadgdb-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.exp1
-rw-r--r--gdb/testsuite/gdb.base/shell.exp36
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" {