diff --git a/gdb/target.c b/gdb/target.c index 6babfc56256..63aa3e95218 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -4390,11 +4390,18 @@ exists_non_stop_target () if (target_is_non_stop_p ()) return true; - scoped_restore_current_thread restore_thread; + /* We can get here quite deep in core code, e.g., from + target_terminal::inferior(). Avoid switching thread context or + anything that would communicate with the target (e.g., to fetch + registers), or flushing e.g., the frame cache, as we may end up + called from within the frame building code. We just switch + inferior in order to be able to call through the + target_stack. */ + scoped_restore_current_inferior restore_inferior; for (inferior *inf : all_inferiors ()) { - switch_to_inferior_no_thread (inf); + set_current_inferior (inf); if (target_is_non_stop_p ()) return true; } diff --git a/gdb/testsuite/gdb.base/annota1.exp b/gdb/testsuite/gdb.base/annota1.exp index 3689f49fa1b..0e28dc8556f 100644 --- a/gdb/testsuite/gdb.base/annota1.exp +++ b/gdb/testsuite/gdb.base/annota1.exp @@ -24,6 +24,7 @@ if ![target_can_use_run_cmd] { } set breakpoints_invalid "\r\n\032\032breakpoints-invalid\r\n" +set frames_invalid "\r\n\032\032frames-invalid\r\n" # # test running programs @@ -226,7 +227,7 @@ gdb_test_multiple "break printf" "break printf" { # # get to printf # -set pat_begin "\r\n\032\032post-prompt\r\nContinuing.\r\n\r\n\032\032starting\r\n\r\n\032\032frames-invalid\r\n${breakpoints_invalid}\r\n\032\032frames-invalid\r\n" +set pat_begin "\r\n\032\032post-prompt\r\nContinuing.\r\n\r\n\032\032starting\r\n${frames_invalid}${breakpoints_invalid}(${frames_invalid})?" set pat_adjust "warning: Breakpoint 3 address previously adjusted from $hex to $hex.\r\n" set pat_end "\r\n\032\032breakpoint 3\r\n\r\nBreakpoint 3, \r\n\032\032frame-begin 0 $hex\r\n\r\n(\032\032frame-address\r\n$hex\r\n\032\032frame-address-end\r\n in \r\n)*.*\032\032frame-function-name\r\n.*printf(@.*)?\r\n\032\032frame-args\r\n.*\032\032frame-end\r\n\r\n\032\032stopped\r\n$gdb_prompt$"