mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-03-07 13:39:43 +08:00
Linux supports multiple "PID namespaces". Processes in different PID namespaces have different views of the system process list. Sometimes, a single process can appear in more than one PID namespace, but with a different PID in each. When GDB and its target are in different PID namespaces, various features can break due to the mismatch between what the target believes its PID to be and what GDB believes its PID to be. The most visible broken functionality is thread enumeration silently failing. This patch explicitly warns users against trying to debug across PID namespaces. The patch introduced no new failures in my test suite run on an x86_64 installation of Ubuntu 14.10. It doesn't include a test: writing an automated test that exercises this code would be very involved because CLONE_NEWNS requires CAP_SYS_ADMIN; the easier way to reproduce the problem is to start a new lxc container. gdb/ 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.
50 lines
1.6 KiB
C
50 lines
1.6 KiB
C
/* Linux-specific PROCFS manipulation routines.
|
|
Copyright (C) 2011-2014 Free Software Foundation, Inc.
|
|
|
|
This file is part of GDB.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef COMMON_LINUX_PROCFS_H
|
|
#define COMMON_LINUX_PROCFS_H
|
|
|
|
#include <unistd.h>
|
|
|
|
/* Return the TGID of LWPID from /proc/pid/status. Returns -1 if not
|
|
found. */
|
|
|
|
extern int linux_proc_get_tgid (pid_t lwpid);
|
|
|
|
/* Return the TracerPid of LWPID from /proc/pid/status. Returns -1 if not
|
|
found. */
|
|
|
|
extern pid_t linux_proc_get_tracerpid (pid_t lwpid);
|
|
|
|
/* Detect `T (stopped)' in `/proc/PID/status'.
|
|
Other states including `T (tracing stop)' are reported as false. */
|
|
|
|
extern int linux_proc_pid_is_stopped (pid_t pid);
|
|
|
|
/* Return non-zero if PID is a zombie. */
|
|
|
|
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 */
|