# Copyright 2013-2020 Free Software Foundation, Inc. # # 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 . load_lib "trace-support.exp" standard_testfile if {[prepare_for_testing "failed to prepare" $testfile $srcfile {debug nopie}]} { return -1 } if ![runto_main] { fail "can't run to main to check for trace support" return -1 } if ![gdb_target_supports_trace] { unsupported "target does not support trace" return -1 } # Set tracepoints, start tracing and collect data. proc set_tracepoint_and_collect { } { global testfile srcfile # Start with a fresh gdb. clean_restart ${testfile} if ![runto_main] { fail "can't run to main" return -1 } gdb_breakpoint "end" qualified gdb_test "trace start" "Tracepoint \[0-9\] at .*" gdb_trace_setactions "set action for tracepoint" "" \ "collect testglob" "^$" \ "collect constglob" "^$" gdb_test_no_output "tstart" gdb_test "continue" ".*Breakpoint.* end .*at.*$srcfile.*" \ "continue to end" gdb_test_no_output "tstop" } with_test_prefix "live" { set_tracepoint_and_collect gdb_test "print testglob" " = 2" gdb_test "print testglob_not_collected" " = 12" gdb_test "print constglob" " = 10000" gdb_test "print constglob_not_collected" " = 100" } with_test_prefix "live target tfind" { gdb_test "tfind 0" "Found trace frame 0, tracepoint \[0-9\]+.*" \ "tfind 0" gdb_test "print testglob" " = 1" gdb_test "print testglob_not_collected" " = " gdb_test "print constglob" " = 10000" gdb_test "print constglob_not_collected" " = 100" gdb_test "tfind" "Target failed to find requested trace frame." \ "tfind does not find a second frame" } # Save trace frames to trace file. set tracefile [standard_output_file ${testfile}] gdb_test "tsave ${tracefile}.tfile" \ "Trace data saved to file '${tracefile}.tfile'.*" \ "save tfile trace" # Test read memory when changing target from remote to ${target}. proc test_from_remote { target } { global gdb_prompt testfile global tracefile with_test_prefix "remote to ${target}" { set_tracepoint_and_collect # Change target to ${target}. set test "change target" gdb_test_multiple "target ${target} ${tracefile}.${target}" "$test" { -re "A program is being debugged already. Kill it. .y or n. " { send_gdb "y\n" exp_continue } -re "$gdb_prompt $" { pass "$test" } } with_test_prefix "w/o setting traceframe" { gdb_test "print testglob" " = " gdb_test "print testglob_not_collected" " = " gdb_test "print constglob" " = 10000" gdb_test "print constglob_not_collected" " = 100" } with_test_prefix "w/ setting traceframe" { gdb_test "tfind 0" "Found trace frame 0, tracepoint \[0-9\]+.*" \ "tfind 0" gdb_test "print testglob" " = 1" gdb_test "print testglob_not_collected" " = " gdb_test "print constglob" " = 10000" gdb_test "print constglob_not_collected" " = 100" gdb_test "tfind" "Target failed to find requested trace frame." \ "tfind does not find a second frame" } } } test_from_remote "tfile" # Test read memory when changing target from exec to ${target} proc teset_from_exec { target } { global srcdir subdir binfile testfile global tracefile # Restart GDB and read the trace data in ${target} target. gdb_exit gdb_start gdb_reinitialize_dir $srcdir/$subdir gdb_file_cmd $binfile gdb_test "target ${target} ${tracefile}.${target}" ".*" \ "change to ${target} target" with_test_prefix "exec to ${target} w/o setting traceframe" { gdb_test "print testglob" " = " gdb_test "print testglob_not_collected" " = " gdb_test "print constglob" " = 10000" gdb_test "print constglob_not_collected" " = 100" } with_test_prefix "exec to ${target} w/ setting traceframe" { gdb_test "tfind 0" "Found trace frame 0, tracepoint \[0-9\]+.*" \ "tfind 0" gdb_test "print testglob" " = 1" gdb_test "print testglob_not_collected" " = " gdb_test "print constglob" " = 10000" gdb_test "print constglob_not_collected" " = 100" gdb_test "tfind" "Target failed to find requested trace frame." \ "tfind does not find a second frame" } } teset_from_exec "tfile"