diff options
author | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2015-08-27 19:12:49 +0200 |
---|---|---|
committer | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2015-08-27 19:12:49 +0200 |
commit | e0fd7c47bd01e0a6eecf5dec4a4be958f8b3bbc8 (patch) | |
tree | 8e740be415fcae9cf50120b49a19ad82eaa09c93 | |
parent | 4e83a1e776c0acdaca9e69be9576db9efcd5f511 (diff) | |
download | gdb-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/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/linux-thread-db.c | 11 |
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; |