aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Weigand <ulrich.weigand@de.ibm.com>2015-08-27 19:12:49 +0200
committerUlrich Weigand <ulrich.weigand@de.ibm.com>2015-08-27 19:12:49 +0200
commite0fd7c47bd01e0a6eecf5dec4a4be958f8b3bbc8 (patch)
tree8e740be415fcae9cf50120b49a19ad82eaa09c93
parent4e83a1e776c0acdaca9e69be9576db9efcd5f511 (diff)
downloadgdb-e0fd7c47bd01e0a6eecf5dec4a4be958f8b3bbc8.zip
gdb-e0fd7c47bd01e0a6eecf5dec4a4be958f8b3bbc8.tar.gz
gdb-e0fd7c47bd01e0a6eecf5dec4a4be958f8b3bbc8.tar.bz2
Fix assertion failure in linux-thread-db
Since we are no longer using thread events by default in linux-thread-db, the find_new_threads_once routine contains an assertion that it should never be called on a live inferior unless using thread events: gdb_assert (!target_has_execution || thread_db_use_events ()); However, there is a code path from thread_db_get_thread_local_address that will in fact call find_new_threads_once in some scenarios. In particular, this is currently always triggered when starting up any Cell/B.E. combined exeuctable. To fix this, this patch removes the call to thread_db_find_new_threads_1 when the current thread was not yet detected. In its place, we now just call thread_from_lwp to detect this one thread if necessary. ChangeLog: * linux-thread-db.c (thread_db_get_thread_local_address): If the thread was not yet discovered, use thread_from_lwp instead of calling thread_db_find_new_threads_1.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/linux-thread-db.c11
2 files changed, 13 insertions, 4 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b572271..8319083 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,9 @@
+2015-08-08 Ulrich Weigand <uweigand@de.ibm.com>
+
+ * linux-thread-db.c (thread_db_get_thread_local_address): If the
+ thread was not yet discovered, use thread_from_lwp instead of
+ calling thread_db_find_new_threads_1.
+
2015-08-27 Simon Marchi <simon.marchi@ericsson.com>
* m88k-tdep.c (m88k_analyze_prologue): Fix inverted allocation
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c
index d6bf56f..855629b 100644
--- a/gdb/linux-thread-db.c
+++ b/gdb/linux-thread-db.c
@@ -1849,13 +1849,16 @@ thread_db_get_thread_local_address (struct target_ops *ops,
struct thread_info *thread_info;
struct target_ops *beneath;
- /* If we have not discovered any threads yet, check now. */
- if (!have_threads (ptid))
- thread_db_find_new_threads_1 (ptid);
-
/* Find the matching thread. */
thread_info = find_thread_ptid (ptid);
+ /* We may not have discovered the thread yet. */
+ if (thread_info != NULL && thread_info->priv == NULL)
+ {
+ thread_from_lwp (ptid);
+ thread_info = find_thread_ptid (ptid);
+ }
+
if (thread_info != NULL && thread_info->priv != NULL)
{
td_err_e err;