# This testcase is part of GDB, the GNU debugger. # # Copyright 2013 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 . # check for btrace support if { [skip_btrace_tests] } { return -1 } # start inferior standard_testfile if [prepare_for_testing function_call_history.exp $testfile {} {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.*" # 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" gdb_test "record function-call-history" " 0\tmain\r 1\tinc\r 2\tmain\r 3\tinc\r 4\tmain\r 5\tinc\r 6\tmain\r 7\tinc\r 8\tmain\r 9\tinc\r 10\tmain\r 11\tinc\r 12\tmain\r 13\tinc\r 14\tmain\r 15\tinc\r 16\tmain\r 17\tinc\r 18\tmain\r 19\tinc\r 20\tmain\r" "record function-call-history - with size unlimited" # 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" # show function call history gdb_test "record function-call-history 0" " 0\tmain\r 1\tinc\r 2\tmain\r 3\tinc\r 4\tmain\r 5\tinc\r 6\tmain\r 7\tinc\r 8\tmain\r 9\tinc\r 10\tmain\r 11\tinc\r 12\tmain\r 13\tinc\r 14\tmain\r 15\tinc\r 16\tmain\r 17\tinc\r 18\tmain\r 19\tinc\r 20\tmain\r" "record function-call-history - show all 21 entries" # show first 15 entries gdb_test_no_output "set record function-call-history-size 15" gdb_test "record function-call-history 0" " 0\tmain\r 1\tinc\r 2\tmain\r 3\tinc\r 4\tmain\r 5\tinc\r 6\tmain\r 7\tinc\r 8\tmain\r 9\tinc\r 10\tmain\r 11\tinc\r 12\tmain\r 13\tinc\r 14\tmain\r" "record function-call-history - show first 15 entries" # show last 6 entries gdb_test "record function-call-history +" " 15\tinc\r 16\tmain\r 17\tinc\r 18\tmain\r 19\tinc\r 20\tmain\r" "record function-call-history - show last 6 entries" # moving further should not work gdb_test "record function-call-history +" "At the end of the branch trace record\\." "record function-call-history - at the end (1)" # make sure we cannot move any further a second time gdb_test "record function-call-history +" "At the end of the branch trace record\\." "record function-call-history - at the end (2)" # moving back showing the latest 15 function calls gdb_test "record function-call-history -" " 6\tmain\r 7\tinc\r 8\tmain\r 9\tinc\r 10\tmain\r 11\tinc\r 12\tmain\r 13\tinc\r 14\tmain\r 15\tinc\r 16\tmain\r 17\tinc\r 18\tmain\r 19\tinc\r 20\tmain\r" "record function-call-history - show last 15 entries" # moving further back shows the 6 first function calls gdb_test "record function-call-history -" " 0\tmain\r 1\tinc\r 2\tmain\r 3\tinc\r 4\tmain\r 5\tinc\r" "record function-call-history - show first 6 entries" # moving further back shouldn't work gdb_test "record function-call-history -" "At the start of the branch trace record\\." "record function-call-history - at the start (1)" # make sure we cannot move any further back gdb_test "record function-call-history -" "At the start of the branch trace record\\." "record function-call-history - at the start (2)" # 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 +" " .*$srcfile:40-41\tmain\r .*$srcfile:22-24\tinc\r .*$srcfile:40-41\tmain\r .*$srcfile:22-24\tinc\r .*$srcfile:40-41\tmain\r .*$srcfile:22-24\tinc\r .*$srcfile:40-41\tmain\r .*$srcfile:22-24\tinc\r .*$srcfile:40-41\tmain\r .*$srcfile:22-24\tinc\r .*$srcfile:40-41\tmain\r .*$srcfile:22-24\tinc\r .*$srcfile:40-41\tmain\r .*$srcfile:22-24\tinc\r .*$srcfile:40-41\tmain\r" "record function-call-history /l - show first 15 entries" # moving forward and expect to see the latest 6 entries gdb_test "record function-call-history /l +" " .*$srcfile:22-24\tinc\r .*$srcfile:40-41\tmain\r .*$srcfile:22-24\tinc\r .*$srcfile:40-41\tmain\r .*$srcfile:22-24\tinc\r .*$srcfile:40-43\tmain\r" "record function-call-history /l - show last 6 entries" # moving further forward shouldn't work gdb_test "record function-call-history /l +" "At the end of the branch trace record\\." "record function-call-history /l - at the end (1)" gdb_test "record function-call-history /l" "At the end of the branch trace record\\." "record function-call-history /l - at the end (2)" set expected_range "3\tinc\r 4\tmain\r 5\tinc\r 6\tmain\r 7\tinc\r 8\tmain\r 9\tinc\r" # show functions in instruction range gdb_test "record function-call-history 3,10" $expected_range "absolute instruction range" gdb_test "record function-call-history 3,+7" $expected_range "relative positive instruction range" gdb_test "record function-call-history 10,-7" $expected_range "relative negative instruction range" # 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 8 times, # so we limit the output to only show the latest 10 function calls gdb_test_no_output "set record function-call-history-size 10" set message "show recursive function call history" gdb_test_multiple "record function-call-history" $message { -re "13\tmain\r\n14\tfib\r\n15\tfib\r\n16\tfib\r\n17\tfib\r\n18\tfib\r\n19\tfib\r\n20\tfib\r\n21\tfib\r\n22 main\r\n$gdb_prompt $" { pass $message } -re "13\tinc\r\n14\tmain\r\n15\tinc\r\n16\tmain\r\n17\tinc\r\n18\tmain\r\n19\tinc\r\n20\tmain\r\n21\tfib\r\n22\tmain\r\n$gdb_prompt $" { # recursive function calls appear only as 1 call kfail "gdb/15240" $message } }