# This testcase is part of GDB, the GNU debugger. # # Copyright 2013-2020 Free Software Foundation, Inc. # # Contributed by Intel Corp. # # 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 . if { [skip_btrace_tests] } { unsupported "target does not support record-btrace" return -1 } standard_testfile if [prepare_for_testing "failed to prepare" $testfile {} {debug}] { return -1 } if ![runto_main] { untested "failed to run to 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,24" \ "\[0-9\]*\tmain\tat $srcfile:40,41" \ "\[0-9\]*\tinc\tat $srcfile:22,24" \ "\[0-9\]*\tmain\tat $srcfile:40,41" \ "\[0-9\]*\tinc\tat $srcfile:22,24" \ "\[0-9\]*\tmain\tat $srcfile:40,41" \ "\[0-9\]*\tinc\tat $srcfile:22,24" \ "\[0-9\]*\tmain\tat $srcfile:40,41" \ "\[0-9\]*\tinc\tat $srcfile:22,24" \ "\[0-9\]*\tmain\tat $srcfile:40,41" \ "\[0-9\]*\tinc\tat $srcfile:22,24" \ "\[0-9\]*\tmain\tat $srcfile:40,41" \ "\[0-9\]*\tinc\tat $srcfile:22,24" \ "\[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,24" \ "\[0-9\]*\tmain\tat $srcfile:40,41" \ "\[0-9\]*\tinc\tat $srcfile:22,24" \ "\[0-9\]*\tmain\tat $srcfile:40,41" \ "\[0-9\]*\tinc\tat $srcfile:22,24" \ "\[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] { untested "failed to run to 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" # 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"