From 3606ccab0fea904adce8487ce4b2b26253a861e7 Mon Sep 17 00:00:00 2001 From: Philippe Waroquiers Date: Thu, 12 Jul 2018 23:04:13 +0200 Subject: [PATCH] Add a test for 'frame apply' gdb/testsuite/ChangeLog 2018-07-12 Philippe Waroquiers * gdb.base/frameapply.c: New file. * gdb.base/frameapply.exp: New file. --- gdb/testsuite/ChangeLog | 5 + gdb/testsuite/gdb.base/frameapply.c | 71 +++++++++++ gdb/testsuite/gdb.base/frameapply.exp | 217 ++++++++++++++++++++++++++++++++++ 3 files changed, 293 insertions(+) create mode 100644 gdb/testsuite/gdb.base/frameapply.c create mode 100644 gdb/testsuite/gdb.base/frameapply.exp diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 95ad798..84bfa77 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2018-07-12 Philippe Waroquiers + * gdb.base/frameapply.c: New file. + * gdb.base/frameapply.exp: New file. + +2018-07-12 Philippe Waroquiers + * gdb.base/skip.exp: Update expected error message. 2018-07-11 Sergio Durigan Junior diff --git a/gdb/testsuite/gdb.base/frameapply.c b/gdb/testsuite/gdb.base/frameapply.c new file mode 100644 index 0000000..dccf403 --- /dev/null +++ b/gdb/testsuite/gdb.base/frameapply.c @@ -0,0 +1,71 @@ +/* This testcase is part of GDB, the GNU debugger. + + Copyright 2018 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 . */ + +static void +setup_done (void) +{ +} + +static int +f1 (int f1arg) +{ + int f1loc; + + f1loc = f1arg - 1; + + setup_done (); + return f1loc; +} + +static int +f2 (int f2arg) +{ + int f2loc; + + f2loc = f1 (f2arg - 1); + + return f2loc; +} + +static int +f3 (int f3arg) +{ + int f3loc; + + f3loc = f2 (f3arg - 1); + + return f3loc; +} + +static int +f4 (int f4arg) +{ + int f4loc; + + f4loc = f3 (f4arg - 1); + + return f4loc; +} + +int +main (void) +{ + int result; + + result = f4 (4); + return 0; +} diff --git a/gdb/testsuite/gdb.base/frameapply.exp b/gdb/testsuite/gdb.base/frameapply.exp new file mode 100644 index 0000000..9f340e5 --- /dev/null +++ b/gdb/testsuite/gdb.base/frameapply.exp @@ -0,0 +1,217 @@ +# This testcase is part of GDB, the GNU debugger. + +# Copyright 2018 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 . + + +# Test 'frame apply [all | COUNT | -COUNT | level LEVEL...] [FLAG]... COMMAND'. + +standard_testfile + +if { [prepare_for_testing "failed to prepare" ${testfile}] } { + return -1 +} + +clean_restart ${binfile} + + +if ![runto setup_done] then { + fail "can't run to setup_done" + return 0 +} + +set any "\[^\r\n\]*" +set ws "\[ \t\]\+" +set number "\[0-9]\+" + + +# Check all | COUNT | -COUNT | level LEVEL... with a simple command. +with_test_prefix "simple command" { + foreach_with_prefix frame_apply_args { + "all" + "6" + "-6" + "level 0-5" + "level 0-3 4-5" + "level 0 1-2 3-5" + "level 0 1 2 3 4 5" + "level 0-0 1-1 2-2 3-3 4-4 5-5" } { + set cmd "frame apply $frame_apply_args p /x 20" + gdb_test $cmd \ + [multi_line \ + "#0${ws}setup_done ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + "#1${ws}${any} f1 ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + "#2${ws}${any} f2 ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + "#3${ws}${any} f3 ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + "#4${ws}${any} f4 ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + "#5${ws}${any} main ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + ] \ + "run a simple command on all frames" + } +} + +# Check frame apply on 3 innermost frames. +with_test_prefix "innermost 3" { + foreach_with_prefix frame_apply_args { + "3" + "level 0-2" } { + set cmd "frame apply $frame_apply_args p /x 20" + gdb_test $cmd \ + [multi_line \ + "#0${ws}setup_done ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + "#1${ws}${any} f1 ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + "#2${ws}${any} f2 ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + ] \ + "run a simple command on the 3 innermost frames" + } +} + +# Check frame apply on 3 outermost frames. +with_test_prefix "outermost 3" { + foreach_with_prefix frame_apply_args { + "-3" } { + set cmd "frame apply $frame_apply_args p /x 20" + gdb_test $cmd \ + [multi_line \ + "#3${ws}${any} f3 ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + "#4${ws}${any} f4 ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + "#5${ws}${any} main ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + ] \ + "run a simple command on the 3 outermost frames" + } +} + +# Check -c (continue) and -s (silently continue) flags. +with_test_prefix "!cont !silent flags" { + foreach_with_prefix frame_apply_args { + "all" + "level 0-5" + } { + set cmd "frame apply $frame_apply_args p f3arg" + gdb_test $cmd \ + [multi_line \ + "#0${ws}setup_done ${any}" \ + "No symbol \\\"f3arg\\\" in current context." \ + ] \ + "run a failing command that aborts frame apply" + } +} + +with_test_prefix "cont !silent flags" { + foreach_with_prefix frame_apply_args { + "all -c" + "level 0-5 -c"} { + set cmd "frame apply $frame_apply_args p f3arg" + gdb_test $cmd \ + [multi_line \ + "#0${ws}setup_done ${any}" \ + "No symbol \\\"f3arg\\\" in current context." \ + "#1${ws}${any} f1 ${any}" \ + "No symbol \\\"f3arg\\\" in current context." \ + "#2${ws}${any} f2 ${any}" \ + "No symbol \\\"f3arg\\\" in current context." \ + "#3${ws}${any} f3 ${any}" \ + "\\\$\[0-9]+ = 3${any}" \ + "#4${ws}${any} f4 ${any}" \ + "No symbol \\\"f3arg\\\" in current context." \ + "#5${ws}${any} main ${any}" \ + "No symbol \\\"f3arg\\\" in current context." \ + ] \ + "run a command failing in all frames except #3, -c to continue" + } +} + +with_test_prefix "!cont silent flags" { + foreach_with_prefix cmd_and_args { + "frame apply all -s" + "faas" + "frame apply level 0-5 -s"} { + set cmd "$cmd_and_args p f3arg" + gdb_test $cmd \ + [multi_line \ + "#3${ws}${any} f3 ${any}" \ + "\\\$\[0-9]+ = 3${any}" \ + ] \ + "run a command failing in all frames except #3, -s to silently continue" + } +} + +# Check quietness. +with_test_prefix "!quiet flag" { + foreach_with_prefix frame_apply_args { + "2" + "level 0-1"} { + set cmd "frame apply $frame_apply_args p /x 20" + gdb_test $cmd \ + [multi_line \ + "#0${ws}setup_done ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + "#1${ws}${any} f1 ${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + ] \ + "run a command, printing location" + } +} + +with_test_prefix "quiet flag" { + foreach_with_prefix frame_apply_args { + "2 -q" + "level 0-1 -q"} { + set cmd "frame apply $frame_apply_args p /x 20" + gdb_test $cmd \ + [multi_line \ + "\\\$\[0-9]+ = 0x14${any}" \ + "\\\$\[0-9]+ = 0x14${any}" \ + ] \ + "run a command with -q quiet flag, printing only command results" + } +} + +# Check multiple flags together. +with_test_prefix "quiet silent flags" { + foreach_with_prefix frame_apply_args { + "all -q -s -q" + "level 0-5 -q -s -q"} { + set cmd "frame apply $frame_apply_args p f3arg" + gdb_test $cmd \ + "\\\$\[0-9]+ = 3${any}" \ + "run a command failing in all frames except #3, -s to silently continue, quiet" + } +} + +# Check invalid flag combinations. +gdb_test "frame apply all -c -s p f3arg" \ + "frame apply all: -c and -s are mutually exclusive" \ + "check -c and -s cannot be used simultaneously" + +# Check some cases of missing or wrong args. +gdb_test "frame apply" "Missing COUNT argument." "missing COUNT" +gdb_test "frame apply -c" "Invalid COUNT argument." "invalid COUNT arg" +gdb_test "frame apply level 4-2 p 1" "inverted range" "inverted range" +gdb_test "frame apply level 0-3" \ + "Please specify a command to apply on the selected frames" \ + "missing command" -- 2.7.4