mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-27 04:52:05 +08:00
4a94e36819
This commit brings all the changes made by running gdb/copyright.py as per GDB's Start of New Year Procedure. For the avoidance of doubt, all changes in this commits were performed by the script.
260 lines
7.5 KiB
Plaintext
260 lines
7.5 KiB
Plaintext
# This testcase is part of GDB, the GNU debugger.
|
|
#
|
|
# Copyright 2013-2022 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"
|