From 1eb2dbb8d73c344e199fd04531ec3f649e2835b2 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Tue, 15 Mar 2016 16:33:04 +0000 Subject: [PATCH] Fix PR gdb/19676: Internal error in linux-thread.db.c if /proc not mounted If /proc is not mounted, GDB fails an assertion in find_new_threads_once: Continuing. .../src/gdb/linux-thread-db.c:1249: internal-error: find_new_threads_once: Assertion `!target_has_execution' failed. A problem internal to GDB has been detected, further debugging may prove unreliable. Quit this debugging session? (y or n) That was supposed to catch misuses of td_ta_thr_iter, which is unsafe for live debugging. However, if /proc is not mounted, we still fallback to using it. I didn't bother with a warning, because GDB already prints several others related to failing to open /proc files. gdb/ChangeLog: 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. --- gdb/ChangeLog | 10 ++++++++++ gdb/linux-thread-db.c | 16 ++++++++++------ 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3e72420..2e30d4a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,6 +1,16 @@ 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 * infrun.c (displaced_step_prepare): Also disable displaced stepping on NOT_SUPPORTED_ERROR. * linux-tdep.c (linux_displaced_step_location): If reading auxv diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 1eb457d..ce60beb 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 { -- 2.7.4