diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3e72420282f..2e30d4acef3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2016-03-15 Pedro Alves + + PR gdb/19676 + * linux-thread-db.c (try_thread_db_load_1): Leave + info->td_ta_thr_iter_p NULL iff debugging a live process and we + have /proc access. + (find_new_threads_once): Assert that we have a non-NULL + info->td_ta_thr_iter_p instead of checking whether the target has + execution. + 2016-03-15 Pedro Alves PR gdb/19676 diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 1eb457de105..ce60bebe3c9 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -564,7 +564,6 @@ try_thread_db_load_1 (struct thread_db_info *info) /* These are essential. */ CHK (TDB_VERBOSE_DLSYM (info, td_ta_map_lwp2thr)); - CHK (TDB_VERBOSE_DLSYM (info, td_ta_thr_iter)); CHK (TDB_VERBOSE_DLSYM (info, td_thr_validate)); CHK (TDB_VERBOSE_DLSYM (info, td_thr_get_info)); @@ -572,10 +571,6 @@ try_thread_db_load_1 (struct thread_db_info *info) TDB_DLSYM (info, td_thr_tls_get_addr); TDB_DLSYM (info, td_thr_tlsbase); -#undef TDB_VERBOSE_DLSYM -#undef TDB_DLSYM -#undef CHK - /* It's best to avoid td_ta_thr_iter if possible. That walks data structures in the inferior's address space that may be corrupted, or, if the target is running, may change while we walk them. If @@ -587,6 +582,15 @@ try_thread_db_load_1 (struct thread_db_info *info) currently on core targets, as it uses ptrace directly. */ if (target_has_execution && linux_proc_task_list_dir_exists (ptid_get_pid (inferior_ptid))) + info->td_ta_thr_iter_p = NULL; + else + CHK (TDB_VERBOSE_DLSYM (info, td_ta_thr_iter)); + +#undef TDB_VERBOSE_DLSYM +#undef TDB_DLSYM +#undef CHK + + if (info->td_ta_thr_iter_p == NULL) { struct lwp_info *lp; int pid = ptid_get_pid (inferior_ptid); @@ -1246,7 +1250,7 @@ find_new_threads_once (struct thread_db_info *info, int iteration, data.new_threads = 0; /* See comment in thread_db_update_thread_list. */ - gdb_assert (!target_has_execution); + gdb_assert (info->td_ta_thr_iter_p != NULL); TRY {