aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorMarkus Metzger <markus.t.metzger@intel.com>2013-05-03 10:51:13 +0200
committerMarkus Metzger <markus.t.metzger@intel.com>2014-01-16 13:06:15 +0100
commite2887aa34ff4d8d972047e48803ed97b23beb739 (patch)
treed1f8e1a61c45a09cc9c3151704f351da8be14754 /gdb
parentb2f4cfdebc3b7feb9572e83570d212f0ef31a78a (diff)
downloadgdb-e2887aa34ff4d8d972047e48803ed97b23beb739.zip
gdb-e2887aa34ff4d8d972047e48803ed97b23beb739.tar.gz
gdb-e2887aa34ff4d8d972047e48803ed97b23beb739.tar.bz2
record-btrace: provide target_find_new_threads method
The "info threads" command tries to read memory, which is not possible during replay. This results in an error message and aborts the command without showing the existing threads. Provide a to_find_new_threads target method to skip the search while replaying. 2014-01-16 Markus Metzger <markus.t.metzger@intel.com> * record-btrace.c (record_btrace_find_new_threads) (record_btrace_thread_alive): New. (init_record_btrace_ops): Initialize to_find_new_threads and to_thread_alive.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/record-btrace.c37
2 files changed, 44 insertions, 0 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 7ca7fb3..95b59b6 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
2014-01-16 Markus Metzger <markus.t.metzger@intel.com>
+ * record-btrace.c (record_btrace_find_new_threads)
+ (record_btrace_thread_alive): New.
+ (init_record_btrace_ops): Initialize to_find_new_threads and
+ to_thread_alive.
+
+2014-01-16 Markus Metzger <markus.t.metzger@intel.com>
+
* record-btrace.c (record_btrace_resume): New.
(record_btrace_wait): New.
(init_record_btrace_ops): Initialize to_wait and to_resume.
diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c
index 1951dce..acea2d6 100644
--- a/gdb/record-btrace.c
+++ b/gdb/record-btrace.c
@@ -1050,6 +1050,41 @@ record_btrace_wait (struct target_ops *ops, ptid_t ptid,
error (_("You can't do this from here. Do 'record goto end', first."));
}
+/* The to_find_new_threads method of target record-btrace. */
+
+static void
+record_btrace_find_new_threads (struct target_ops *ops)
+{
+ /* Don't expect new threads if we're replaying. */
+ if (record_btrace_is_replaying ())
+ return;
+
+ /* Forward the request. */
+ for (ops = ops->beneath; ops != NULL; ops = ops->beneath)
+ if (ops->to_find_new_threads != NULL)
+ {
+ ops->to_find_new_threads (ops);
+ break;
+ }
+}
+
+/* The to_thread_alive method of target record-btrace. */
+
+static int
+record_btrace_thread_alive (struct target_ops *ops, ptid_t ptid)
+{
+ /* We don't add or remove threads during replay. */
+ if (record_btrace_is_replaying ())
+ return find_thread_ptid (ptid) != NULL;
+
+ /* Forward the request. */
+ for (ops = ops->beneath; ops != NULL; ops = ops->beneath)
+ if (ops->to_thread_alive != NULL)
+ return ops->to_thread_alive (ops, ptid);
+
+ return 0;
+}
+
/* Initialize the record-btrace target ops. */
static void
@@ -1086,6 +1121,8 @@ init_record_btrace_ops (void)
ops->to_get_unwinder = &record_btrace_frame_unwind;
ops->to_resume = record_btrace_resume;
ops->to_wait = record_btrace_wait;
+ ops->to_find_new_threads = record_btrace_find_new_threads;
+ ops->to_thread_alive = record_btrace_thread_alive;
ops->to_stratum = record_stratum;
ops->to_magic = OPS_MAGIC;
}