diff options
Diffstat (limited to 'gdb/linux-thread-db.c')
-rw-r--r-- | gdb/linux-thread-db.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/gdb/linux-thread-db.c b/gdb/linux-thread-db.c index 352fac1..c49b567 100644 --- a/gdb/linux-thread-db.c +++ b/gdb/linux-thread-db.c @@ -1217,12 +1217,41 @@ thread_db_new_objfile (struct objfile *objfile) check_for_thread_db (); } +static void +check_pid_namespace_match (void) +{ + /* Check is only relevant for local targets targets. */ + if (target_can_run (¤t_target)) + { + /* If the child is in a different PID namespace, its idea of its + PID will differ from our idea of its PID. When we scan the + child's thread list, we'll mistakenly think it has no threads + since the thread PID fields won't match the PID we give to + libthread_db. */ + char *our_pid_ns = linux_proc_pid_get_ns (getpid (), "pid"); + char *inferior_pid_ns = linux_proc_pid_get_ns ( + ptid_get_pid (inferior_ptid), "pid"); + + if (our_pid_ns != NULL && inferior_pid_ns != NULL + && strcmp (our_pid_ns, inferior_pid_ns) != 0) + { + warning (_ ("Target and debugger are in different PID " + "namespaces; thread lists and other data are " + "likely unreliable")); + } + + xfree (our_pid_ns); + xfree (inferior_pid_ns); + } +} + /* This function is called via the inferior_created observer. This handles the case of debugging statically linked executables. */ static void thread_db_inferior_created (struct target_ops *target, int from_tty) { + check_pid_namespace_match (); check_for_thread_db (); } |