binutils-gdb/gdb/testsuite/gdb.btrace/enable-new-thread.exp
Markus Metzger 1a476b6d68 gdb, btrace: forward fetch_registers for unknown threads
In the record-btrace target, while replaying, we can only provide the PC
register.  The btrace state is stored in the thread_info.  So, when trying
to determine whether we are currently replaying, GDB calls
find_thread_ptid() to obtain the thread_info.  It also asserts that we do
have a thread_info.

For new threads, libthread-db may fetch registers before the thread is
known to GDB.  In this case, find_thread_ptid() returns nullptr and the
assertion fails.

Forward the fetch_registers request to the target beneath in that case.

gdb/ChangeLog:

2020-03-19  Markus Metzger  <markus.t.metzger@intel.com>

	* record-btrace.c (record_btrace_target::fetch_registers): Forward
	request if we do not have a thread_info.

gdb/testsuite/ChangeLog:

2020-03-19  Markus Metzger  <markus.t.metzger@intel.com>

	* gdb.btrace/enable-new-thread.c: New test.
	* gdb.btrace/enable-new-thread.exp: New file.
2020-04-21 15:51:06 +02:00

58 lines
1.7 KiB
Plaintext

# This testcase is part of GDB, the GNU debugger.
#
# Copyright 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 <http://www.gnu.org/licenses/>.
# Test that new threads of recorded inferiors also get recorded.
if { [skip_btrace_tests] } {
unsupported "target does not support record-btrace"
return -1
}
standard_testfile
if [prepare_for_testing "failed to prepare" $testfile $srcfile {debug pthreads}] {
return -1
}
if ![runto_main] {
untested "failed to run to main"
return -1
}
# Record the main thread. Recording will automatically be enabled for the
# other thread.
gdb_test "record btrace"
gdb_breakpoint [gdb_get_line_number "bp.1" $srcfile]
gdb_continue_to_breakpoint "cont to bp.1" ".*/\\* bp\.1 \\*/.*"
proc check_thread_recorded { num } {
global decimal
with_test_prefix "thread $num" {
gdb_test "thread $num" "Switching to thread $num.*"
gdb_test "info record" [multi_line \
"Active record target: record-btrace" \
".*" \
"Recorded $decimal instructions in $decimal functions \[^\\\r\\\n\]*" \
]
}
}
check_thread_recorded 1
check_thread_recorded 2