| Index: gdb/testsuite/gdb.btrace/instruction_history.exp
|
| diff --git a/gdb/testsuite/gdb.btrace/instruction_history.exp b/gdb/testsuite/gdb.btrace/instruction_history.exp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c1a61b75cd60355b4862761a52a85339aefff31c
|
| --- /dev/null
|
| +++ b/gdb/testsuite/gdb.btrace/instruction_history.exp
|
| @@ -0,0 +1,195 @@
|
| +# This testcase is part of GDB, the GNU debugger.
|
| +#
|
| +# Copyright 2013 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/>.
|
| +
|
| +# check for btrace support
|
| +if { [skip_btrace_tests] } { return -1 }
|
| +
|
| +# compile and run to main
|
| +standard_testfile .c .S
|
| +if [prepare_for_testing $testfile.exp $testfile "$srcfile $srcfile2" {debug}] {
|
| + return -1
|
| +}
|
| +if ![runto_main] {
|
| + return -1
|
| +}
|
| +
|
| +# set bp before loop and continue
|
| +set bp_location [gdb_get_line_number "bp.1" $srcfile2]
|
| +gdb_breakpoint $srcfile2:$bp_location
|
| +gdb_continue_to_breakpoint "cont to $bp_location" ".*$srcfile2:$bp_location.*"
|
| +
|
| +# start btrace
|
| +gdb_test_no_output "record btrace"
|
| +
|
| +# set bp after loop and continue
|
| +set bp_location [gdb_get_line_number "bp.2" $srcfile2]
|
| +gdb_breakpoint $srcfile2:$bp_location
|
| +gdb_continue_to_breakpoint "cont to $bp_location" ".*$srcfile2:$bp_location.*"
|
| +
|
| +# The following test cases test if "browsing" through the
|
| +# instruction history works as expected. So for the tests
|
| +# it is necessary to count the number of lines that are
|
| +# shown by the "record instruction-history" command.
|
| +
|
| +set testname "determine number of recorded instructions"
|
| +gdb_test_multiple "info record" $testname {
|
| + -re "Active record target: record-btrace\r\nRecorded \(\[0-9\]*\) instructions in \(\[0-9\]*\) functions for thread 1 .*\\.\r\n$gdb_prompt $" {
|
| + set traced $expect_out(1,string)
|
| + set traced_functions $expect_out(2,string)
|
| + pass $testname
|
| + }
|
| +}
|
| +
|
| +# we have exactly 7 instructions here
|
| +set message "exactly 7 instructions"
|
| +if { $traced != 7 } {
|
| + fail $message
|
| +} else {
|
| + pass $message
|
| +}
|
| +
|
| +# test that we see the expected instructions
|
| +gdb_test "record instruction-history 1,6" "
|
| +1\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
|
| +2\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax\r
|
| +3\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
|
| +4\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax\r
|
| +5\t 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r"
|
| +
|
| +gdb_test "record instruction-history /f 1,+5" "
|
| +1\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
|
| +2\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax\r
|
| +3\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
|
| +4\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax\r
|
| +5\t 0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r"
|
| +
|
| +gdb_test "record instruction-history /p 6,-5" "
|
| +1\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
|
| +2\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tdec %eax\r
|
| +3\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
|
| +4\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tcmp \\\$0x0,%eax\r
|
| +5\t0x\[0-9a-f\]+ <loop\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r"
|
| +
|
| +gdb_test "record instruction-history /pf 1,6" "
|
| +1\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
|
| +2\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tdec %eax\r
|
| +3\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tjmp 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r
|
| +4\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tcmp \\\$0x0,%eax\r
|
| +5\t0x\[0-9a-f\]+ <\\+\[0-9\]+>:\tje 0x\[0-9a-f\]+ <loop\\+\[0-9\]+>\r"
|
| +
|
| +# the following tests are checking the iterators
|
| +# to avoid lots of regexps, we just check the number of lines that
|
| +# were printed during command execution.
|
| +
|
| +# test_lines_output returns the output lines from command as a list.
|
| +proc test_lines_output { command message } {
|
| + global gdb_prompt
|
| + set message "test_lines_output: $message"
|
| + gdb_test_multiple $command $message {
|
| + -re "\n\(.*\)\r\n$gdb_prompt $" {
|
| + return [split [string trim $expect_out(1,string)] "\n"]
|
| + }
|
| + }
|
| +}
|
| +
|
| +# test_lines_length returns the number of lines from command.
|
| +proc test_lines_length { command message } {
|
| + return [llength [test_lines_output $command $message]]
|
| +}
|
| +
|
| +# show instruction history with unlimited size, we expect to see
|
| +# all $traced instructions
|
| +gdb_test_no_output "set record instruction-history-size 0"
|
| +set message "record instruction-history - unlimited"
|
| +set lines [test_lines_length "record instruction-history 0" $message]
|
| +if { $traced != $lines } {
|
| + fail $message
|
| +} else {
|
| + pass $message
|
| +}
|
| +
|
| +gdb_test_no_output "set record instruction-history-size $traced"
|
| +set message "record instruction-history - traced"
|
| +set lines [test_lines_length "record instruction-history 0" $message]
|
| +if { $traced != $lines } {
|
| + fail $message
|
| +} else {
|
| + pass $message
|
| +}
|
| +
|
| +# test that the iterator works
|
| +set history_size 3
|
| +gdb_test_no_output "set record instruction-history-size $history_size"
|
| +set message "browse history forward start"
|
| +set lines [test_lines_length "record instruction-history 0" $message]
|
| +if { $lines != $history_size } {
|
| + fail $message
|
| +} else {
|
| + pass $message
|
| +}
|
| +
|
| +set message "browse history forward middle"
|
| +set lines [test_lines_length "record instruction-history +" $message]
|
| +if { $lines != $history_size } {
|
| + fail $message
|
| +} else {
|
| + pass $message
|
| +}
|
| +
|
| +set message "browse history forward last"
|
| +set lines [test_lines_length "record instruction-history +" $message]
|
| +if { $lines != 1 } {
|
| + fail $message
|
| +} else {
|
| + pass $message
|
| +}
|
| +
|
| +gdb_test "record instruction-history" "At the end of the branch trace record\\." "browse history forward beyond 1"
|
| +
|
| +# make sure we cannot move further
|
| +gdb_test "record instruction-history" "At the end of the branch trace record\\." "browse history forward beyond 2"
|
| +
|
| +set message "browse history backward last"
|
| +set lines [test_lines_length "record instruction-history -" $message]
|
| +if { $lines != $history_size } {
|
| + fail $message
|
| +} else {
|
| + pass $message
|
| +}
|
| +
|
| +set message "browse history backward middle"
|
| +set lines [test_lines_length "record instruction-history -" $message]
|
| +if { $lines != $history_size } {
|
| + fail $message
|
| +} else {
|
| + pass $message
|
| +}
|
| +
|
| +set message "browse history backward first"
|
| +set lines [test_lines_length "record instruction-history -" $message]
|
| +if { $lines != 1 } {
|
| + fail $message
|
| +} else {
|
| + pass $message
|
| +}
|
| +
|
| +gdb_test "record instruction-history -" "At the start of the branch trace record\\." "browse history backward beyond 1"
|
| +
|
| +# make sure we cannot move further back
|
| +gdb_test "record instruction-history -" "At the start of the branch trace record\\." "browse history backward beyond 2"
|
|
|