[1/3] gdb, btrace: forward fetch_registers for unknown threads

Message ID 20200416070052.3553483-1-markus.t.metzger@intel.com
State New
Headers show
Series
  • [1/3] gdb, btrace: forward fetch_registers for unknown threads
Related show

Commit Message

Rogerio Alves via Gdb-patches April 16, 2020, 7 a.m.
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.
---
 gdb/record-btrace.c                           | 11 +++-
 gdb/testsuite/gdb.btrace/enable-new-thread.c  | 36 ++++++++++++
 .../gdb.btrace/enable-new-thread.exp          | 55 +++++++++++++++++++
 3 files changed, 99 insertions(+), 3 deletions(-)
 create mode 100644 gdb/testsuite/gdb.btrace/enable-new-thread.c
 create mode 100644 gdb/testsuite/gdb.btrace/enable-new-thread.exp

-- 
2.25.1

Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Gary Kershaw
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928

Comments

Rogerio Alves via Gdb-patches April 16, 2020, 6:12 p.m. | #1
On 4/16/20 8:00 AM, Markus Metzger via Gdb-patches wrote:

> --- /dev/null

> +++ b/gdb/testsuite/gdb.btrace/enable-new-thread.exp

> @@ -0,0 +1,55 @@

> +# 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/>.

> +


Please add a short intro comment describing what the testcase is about.
Like, "Test that recording is automatically enabled for spawned threads",
or whatever makes sense here.

Thanks,
Pedro Alves
Rogerio Alves via Gdb-patches April 20, 2020, 8:39 a.m. | #2
Hello Pedro,

Thanks for your review.

> > +# You should have received a copy of the GNU General Public License

> > +# along with this program.  If not, see <http://www.gnu.org/licenses/>.

> > +

> 

> Please add a short intro comment describing what the testcase is about.

> Like, "Test that recording is automatically enabled for spawned threads",

> or whatever makes sense here.


+# Test that new threads of recorded inferiors also get recorded.
+

OK?

Markus.
Intel Deutschland GmbH
Registered Address: Am Campeon 10-12, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de
Managing Directors: Christin Eisenschmid, Gary Kershaw
Chairperson of the Supervisory Board: Nicole Lau
Registered Office: Munich
Commercial Register: Amtsgericht Muenchen HRB 186928
Rogerio Alves via Gdb-patches April 20, 2020, 1:59 p.m. | #3
On 4/20/20 9:39 AM, Metzger, Markus T via Gdb-patches wrote:
> Hello Pedro,

> 

> Thanks for your review.

> 

>>> +# You should have received a copy of the GNU General Public License

>>> +# along with this program.  If not, see <http://www.gnu.org/licenses/>.

>>> +

>>

>> Please add a short intro comment describing what the testcase is about.

>> Like, "Test that recording is automatically enabled for spawned threads",

>> or whatever makes sense here.

> 

> +# Test that new threads of recorded inferiors also get recorded.

> +

> 

> OK?


OK.

Thanks,
Pedro Alves

Patch

diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 2ca9a61457a..2523b05ba92 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -1532,11 +1532,16 @@  record_btrace_target::remove_breakpoint (struct gdbarch *gdbarch,
 void
 record_btrace_target::fetch_registers (struct regcache *regcache, int regno)
 {
+  btrace_insn_iterator *replay = nullptr;
+
+  /* Thread-db may ask for a thread's registers before GDB knows about the
+     thread.  We forward the request to the target beneath in this
+     case.  */
   thread_info *tp = find_thread_ptid (regcache->target (), regcache->ptid ());
-  gdb_assert (tp != NULL);
+  if (tp != nullptr)
+    replay =  tp->btrace.replay;
 
-  btrace_insn_iterator *replay = tp->btrace.replay;
-  if (replay != NULL && !record_btrace_generating_corefile)
+  if (replay != nullptr && !record_btrace_generating_corefile)
     {
       const struct btrace_insn *insn;
       struct gdbarch *gdbarch;
diff --git a/gdb/testsuite/gdb.btrace/enable-new-thread.c b/gdb/testsuite/gdb.btrace/enable-new-thread.c
new file mode 100644
index 00000000000..d4dc240e314
--- /dev/null
+++ b/gdb/testsuite/gdb.btrace/enable-new-thread.c
@@ -0,0 +1,36 @@ 
+/* 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/>.  */
+
+#include <pthread.h>
+#include <unistd.h>
+
+static void *
+test (void *arg)
+{
+  return arg; /* bp.1 */
+}
+
+int
+main (void)
+{
+  pthread_t th;
+
+  pthread_create (&th, NULL, test, NULL);
+  pthread_join (th, NULL);
+
+  return 0;
+}
diff --git a/gdb/testsuite/gdb.btrace/enable-new-thread.exp b/gdb/testsuite/gdb.btrace/enable-new-thread.exp
new file mode 100644
index 00000000000..8671cd70aef
--- /dev/null
+++ b/gdb/testsuite/gdb.btrace/enable-new-thread.exp
@@ -0,0 +1,55 @@ 
+# 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/>.
+
+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