+2014-11-11 Daniel Colascione <dancol@dancol.org>
+
+ Warn about cross-PID-namespace debugging.
+ * nat/linux-procfs.h (linux_proc_pid_get_ns): New prototype.
+ * nat/linux-procfs.c (linux_proc_pid_get_ns): New function.
+ * linux-thread-db.c (check_pid_namespace_match): New function.
+ (thread_db_inferior_created): Call it.
+
2014-11-10 Doug Evans <xdje42@gmail.com>
* symmisc.c (print_objfile_statistics): Remove trailing whitespace.
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 ();
}
{
return linux_proc_pid_has_state (pid, "Z (zombie)");
}
+
+/* See linux-procfs.h declaration. */
+
+char *
+linux_proc_pid_get_ns (pid_t pid, const char *ns)
+{
+ char buf[100];
+ char nsval[64];
+ int ret;
+ xsnprintf (buf, sizeof (buf), "/proc/%d/ns/%s", (int) pid, ns);
+ ret = readlink (buf, nsval, sizeof (nsval));
+ if (0 < ret && ret < sizeof (nsval))
+ {
+ nsval[ret] = '\0';
+ return xstrdup (nsval);
+ }
+
+ return NULL;
+}
extern int linux_proc_pid_is_zombie (pid_t pid);
+/* Return an opaque string identifying PID's NS namespace or NULL if
+ * the information is unavailable. The returned string must be
+ * released with xfree. */
+
+extern char *linux_proc_pid_get_ns (pid_t pid, const char *ns);
+
#endif /* COMMON_LINUX_PROCFS_H */