| # This testcase is part of GDB, the GNU debugger. |
| |
| # Copyright 2018-2021 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/>. |
| |
| |
| # Test 'frame apply [all | COUNT | -COUNT | level LEVEL...] [FLAG]... COMMAND'. |
| |
| standard_testfile |
| |
| if { [prepare_for_testing "failed to prepare" ${testfile}] } { |
| return -1 |
| } |
| |
| if ![runto setup_done] then { |
| 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" |
| gdb_test "faas" "Please specify a command to apply on all frames" \ |
| "missing command for faas" |