# Copyright 2022 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 . # Test that GDB/MI commands preserve user selected context when # passed --thread and/or --frame. load_lib mi-support.exp standard_testfile if {[build_executable $testfile.exp $testfile ${srcfile} "debug pthreads"] == -1} { untested "failed to compile" return -1 } set main_break_line [gdb_get_line_number "main break line"] set any "\[^\r\n\]*" mi_clean_restart $binfile mi_create_breakpoint "$srcfile:$main_break_line" "set breakpoint in main" mi_run_cmd mi_expect_stop "breakpoint-hit" "main" "" $srcfile $main_break_line \ { "" "disp=\"keep\"" } "run to breakpoint in main" mi_gdb_test "thread" \ ".*Current thread is 1.*" \ "info thread 1" # Run -stack-info-depth in a different thread, the current thread # should not change. mi_gdb_test "-stack-info-depth --thread 3" \ "\\^done,depth=.*" \ "-stack-info-depth --thread 3" mi_gdb_test "thread" \ ".*Current thread is 1.*" \ "info thread 2" # Expect GDB to switch to thread 3. mi_gdb_test "-thread-select 3" \ "\\^done,${any}new-thread-id=\"3\"${any}" \ "-thread-select 3" mi_gdb_test "thread" \ ".*Current thread is 3.*" \ "info thread 3" # Expect GDB to switch to thread 1. mi_gdb_test "-thread-select --thread 2 1" \ "\\^done,${any}new-thread-id=\"1\"${any}" \ "-thread-select --thread 2 1" mi_gdb_test "thread" \ ".*Current thread is 1.*" \ "info thread 4" # Expect GDB to switch to thread 2. mi_gdb_test "-thread-select --thread 2 2" \ "\\^done,.*" \ "-thread-select --thread 2 2" mi_gdb_test "thread" \ ".*Current thread is 2.*" \ "info thread 5" # Check we're in frame 0. mi_gdb_test "frame" \ ".*#0 .*child_sub_function .*" \ "frame 1" # Ask about a different frame in the current thread, the current frame # should not change. mi_gdb_test "-stack-info-frame --thread 2 --frame 1" \ "\\^done,frame=\{level=\"1\".*" \ "-stack-info-frame 1" mi_gdb_test "thread" \ ".*Current thread is 2.*" \ "info thread 6" mi_gdb_test "frame" \ ".*#0 .*child_sub_function.*" \ "frame 2" # Ask about a different frame in a different thread. After this the # current thread and frame should not have changed. mi_gdb_test "-stack-info-frame --thread 3 --frame 1" \ "\\^done,frame=\{level=\"1\".*" \ "-stack-info-frame 2" mi_gdb_test "thread" \ ".*Current thread is 2.*" \ "info thread 7" mi_gdb_test "frame" \ ".*#0 .*child_sub_function.*" \ "frame 3" # Select a different frame in the current thread. Despite the use of # the --frame option, we do expect the currently selected frame to # change. mi_gdb_test "-stack-select-frame --thread 2 --frame 0 1" \ "\\^done" \ "--stack-select-frame 1" mi_gdb_test "thread" \ ".*Current thread is 2.*" \ "info thread 8" mi_gdb_test "frame" \ ".*#1 .*child_function.*" \ "frame 4" # Similar to the previous test, but this time the --frame option is # the same as the frame we are selecting. We still expect GDB to # update the currently selected frame. mi_gdb_test "-stack-select-frame --thread 2 --frame 2 2" \ "\\^done" \ "--stack-select-frame 2" mi_gdb_test "thread" \ ".*Current thread is 2.*" \ "info thread 9" mi_gdb_test "frame" \ ".*#2 0x.*" \ "frame 5" # Now select a frame in a different thread. We expect both the # currently selected thread, and the currently selected frame to be # updated. mi_gdb_test "-stack-select-frame --thread 1 --frame 0 0" \ "\\^done" \ "--stack-select-frame 3" mi_gdb_test "thread" \ ".*Current thread is 1.*" \ "info thread 10" mi_gdb_test "frame" \ ".*#0 main.*" \ "frame 6"