| # This testcase is part of GDB, the GNU debugger. |
| # |
| # Copyright 2013-2021 Free Software Foundation, Inc. |
| # |
| # Contributed by Intel Corp. <christian.himpel@intel.com> |
| # |
| # 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/>. |
| |
| if { [skip_btrace_tests] } { |
| unsupported "target does not support record-btrace" |
| return -1 |
| } |
| |
| # We expect a specific function call history. This gets messed up with |
| # PIE on 32-bit. |
| standard_testfile |
| if [prepare_for_testing "failed to prepare" $testfile {} {nopie debug}] { |
| return -1 |
| } |
| |
| if ![runto_main] { |
| return -1 |
| } |
| |
| # start btrace |
| gdb_test_no_output "record btrace" |
| |
| # set bp after increment loop and continue |
| set bp_location [gdb_get_line_number "bp.1" $testfile.c] |
| gdb_breakpoint $bp_location |
| gdb_continue_to_breakpoint "cont to $bp_location" ".*$testfile.c:$bp_location.*" |
| |
| proc rec_fun_all {} { |
| gdb_test "record function-call-history 1" [multi_line \ |
| "1\tmain" \ |
| "2\tinc" \ |
| "3\tmain" \ |
| "4\tinc" \ |
| "5\tmain" \ |
| "6\tinc" \ |
| "7\tmain" \ |
| "8\tinc" \ |
| "9\tmain" \ |
| "10\tinc" \ |
| "11\tmain" \ |
| "12\tinc" \ |
| "13\tmain" \ |
| "14\tinc" \ |
| "15\tmain" \ |
| "16\tinc" \ |
| "17\tmain" \ |
| "18\tinc" \ |
| "19\tmain" \ |
| "20\tinc" \ |
| "21\tmain"] |
| } |
| |
| # show function call history with unlimited size, we expect to see all 21 entries |
| gdb_test_no_output "set record function-call-history-size 0" |
| with_test_prefix "size unlimited" rec_fun_all |
| |
| # show function call history with size of 21, we expect to see all 21 entries |
| gdb_test_no_output "set record function-call-history-size 21" |
| with_test_prefix "size 21" rec_fun_all |
| |
| # show first 15 entries |
| gdb_test_no_output "set record function-call-history-size 15" |
| gdb_test "record function-call-history 1" [multi_line \ |
| "1\tmain" \ |
| "2\tinc" \ |
| "3\tmain" \ |
| "4\tinc" \ |
| "5\tmain" \ |
| "6\tinc" \ |
| "7\tmain" \ |
| "8\tinc" \ |
| "9\tmain" \ |
| "10\tinc" \ |
| "11\tmain" \ |
| "12\tinc" \ |
| "13\tmain" \ |
| "14\tinc" \ |
| "15\tmain"] "forward - 1" |
| |
| # show last 6 entries |
| gdb_test "record function-call-history +" [multi_line \ |
| "16\tinc" \ |
| "17\tmain" \ |
| "18\tinc" \ |
| "19\tmain" \ |
| "20\tinc" \ |
| "21\tmain"] "forward - 2" |
| |
| # moving further should not work |
| gdb_test "record function-call-history +" "At the end of the branch trace record\\." "forward - 3" |
| |
| # make sure we cannot move any further a second time |
| gdb_test "record function-call-history +" "At the end of the branch trace record\\." "forward - 4" |
| |
| # moving back showing the latest 15 function calls |
| gdb_test "record function-call-history -" [multi_line \ |
| "7\tmain" \ |
| "8\tinc" \ |
| "9\tmain" \ |
| "10\tinc" \ |
| "11\tmain" \ |
| "12\tinc" \ |
| "13\tmain" \ |
| "14\tinc" \ |
| "15\tmain" \ |
| "16\tinc" \ |
| "17\tmain" \ |
| "18\tinc" \ |
| "19\tmain" \ |
| "20\tinc" \ |
| "21\tmain"] "backward - 1" |
| |
| # moving further back shows the 6 first function calls |
| gdb_test "record function-call-history -" [multi_line \ |
| "1\tmain" \ |
| "2\tinc" \ |
| "3\tmain" \ |
| "4\tinc" \ |
| "5\tmain" \ |
| "6\tinc"] "backward - 2" |
| |
| # moving further back shouldn't work |
| gdb_test "record function-call-history -" "At the start of the branch trace record\\." "backward - 3" |
| |
| # make sure we cannot move any further back |
| gdb_test "record function-call-history -" "At the start of the branch trace record\\." "backward - 4" |
| |
| # don't mess around with path names |
| gdb_test_no_output "set filename-display basename" |
| |
| # moving forward again, but this time with file and line number, expected to see the first 15 entries |
| gdb_test "record function-call-history /l +" [multi_line \ |
| "\[0-9\]*\tmain\tat $srcfile:40,41" \ |
| "\[0-9\]*\tinc\tat $srcfile:22,2\[34\]" \ |
| "\[0-9\]*\tmain\tat $srcfile:40,41" \ |
| "\[0-9\]*\tinc\tat $srcfile:22,2\[34\]" \ |
| "\[0-9\]*\tmain\tat $srcfile:40,41" \ |
| "\[0-9\]*\tinc\tat $srcfile:22,2\[34\]" \ |
| "\[0-9\]*\tmain\tat $srcfile:40,41" \ |
| "\[0-9\]*\tinc\tat $srcfile:22,2\[34\]" \ |
| "\[0-9\]*\tmain\tat $srcfile:40,41" \ |
| "\[0-9\]*\tinc\tat $srcfile:22,2\[34\]" \ |
| "\[0-9\]*\tmain\tat $srcfile:40,41" \ |
| "\[0-9\]*\tinc\tat $srcfile:22,2\[34\]" \ |
| "\[0-9\]*\tmain\tat $srcfile:40,41" \ |
| "\[0-9\]*\tinc\tat $srcfile:22,2\[34\]" \ |
| "\[0-9\]*\tmain\tat $srcfile:40,41" \ |
| ] "forward /l - 1" |
| |
| # moving forward and expect to see the latest 6 entries |
| gdb_test "record function-call-history /l +" [multi_line \ |
| "\[0-9\]*\tinc\tat $srcfile:22,2\[34\]" \ |
| "\[0-9\]*\tmain\tat $srcfile:40,41" \ |
| "\[0-9\]*\tinc\tat $srcfile:22,2\[34\]" \ |
| "\[0-9\]*\tmain\tat $srcfile:40,41" \ |
| "\[0-9\]*\tinc\tat $srcfile:22,2\[34\]" \ |
| "\[0-9\]*\tmain\tat $srcfile:40,43" \ |
| ] "forward /l - 2" |
| |
| # moving further forward shouldn't work |
| gdb_test "record function-call-history /l +" "At the end of the branch trace record\\." "forward /l - 3" |
| gdb_test "record function-call-history /l" "At the end of the branch trace record\\." "forward /l - 4" |
| |
| set expected_range [multi_line \ |
| "4\tinc" \ |
| "5\tmain" \ |
| "6\tinc" \ |
| "7\tmain" \ |
| "8\tinc" \ |
| "9\tmain" \ |
| "10\tinc"] |
| |
| # show functions in instruction range |
| gdb_test "record function-call-history 4,10" $expected_range |
| gdb_test "record function-call-history 4,+7" $expected_range |
| gdb_test "record function-call-history 10,-7" $expected_range |
| gdb_test "record function-call-history 4,4" "4\tinc\r" |
| |
| # set bp after fib recursion and continue |
| set bp_location [gdb_get_line_number "bp.2" $testfile.c] |
| gdb_breakpoint $bp_location |
| gdb_continue_to_breakpoint "cont to $bp_location" ".*$testfile.c:$bp_location.*" |
| |
| # at this point we expect to have main, fib, ..., fib, main, where fib occurs 9 times, |
| # so we limit the output to only show the latest 11 function calls |
| gdb_test_no_output "set record function-call-history-size 11" |
| gdb_test "record function-call-history" [multi_line \ |
| "21\tmain" \ |
| "22\tfib" \ |
| "23\tfib" \ |
| "24\tfib" \ |
| "25\tfib" \ |
| "26\tfib" \ |
| "27\tfib" \ |
| "28\tfib" \ |
| "29\tfib" \ |
| "30\tfib" \ |
| "31\tmain"] "recursive" |
| |
| # show indented function call history for fib |
| gdb_test "record function-call-history /c 21, +11" [multi_line \ |
| "21\tmain" \ |
| "22\t fib" \ |
| "23\t fib" \ |
| "24\t fib" \ |
| "25\t fib" \ |
| "26\t fib" \ |
| "27\t fib" \ |
| "28\t fib" \ |
| "29\t fib" \ |
| "30\t fib" \ |
| "31\tmain" \ |
| ] "indented" |
| |
| # make sure we can handle incomplete trace with respect to indentation |
| if ![runto_main] { |
| return -1 |
| } |
| # navigate to the fib in line 24 above |
| gdb_breakpoint fib |
| gdb_continue_to_breakpoint "cont to fib.1" |
| gdb_continue_to_breakpoint "cont to fib.2" |
| gdb_continue_to_breakpoint "cont to fib.3" |
| gdb_continue_to_breakpoint "cont to fib.4" |
| |
| # start tracing |
| gdb_test_no_output "record btrace" "start recording after rerun" |
| |
| # continue until line 30 above |
| delete_breakpoints |
| set bp_location [gdb_get_line_number "bp.2" $testfile.c] |
| gdb_breakpoint $bp_location |
| gdb_continue_to_breakpoint "cont to bp.2" ".*$testfile.c:$bp_location\r\n.*" |
| |
| # let's look at the trace. we expect to see the tail of the above listing. |
| gdb_test "record function-call-history /c" [multi_line \ |
| "1\t fib" \ |
| "2\t fib" \ |
| "3\t fib" \ |
| "4\t fib" \ |
| "5\t fib" \ |
| "6\tmain" \ |
| ] "indented tail" |