[CRIU] [PATCH] criu restore: mismatched pid debug
Kir Kolyshkin
kir at openvz.org
Tue Apr 25 15:19:13 PDT 2017
[This sender failed our fraud detection checks and may not be who they appear to be. Learn about spoofing at http://aka.ms/LearnAboutSpoofing]
Sometimes we fail to restore because of PID mismatch. In this case,
we would like to know who the hell has taken our PID. Let's print
a process tree, which looks something like this (this example is
obviously from the host):
1 /usr/lib/systemd/systemd --switched-root --system --deserialize 24
\_482 /usr/lib/systemd/systemd-journald
\_746 /sbin/auditd
\_748 /sbin/audispd
\_751 /usr/sbin/sedispatch
\_769 /usr/lib/systemd/systemd-logind
This is debug for https://github.com/xemul/criu/issues/282.
Signed-off-by: Kir Kolyshkin <kir at openvz.org>
---
criu/cr-restore.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 45 insertions(+)
diff --git a/criu/cr-restore.c b/criu/cr-restore.c
index e78b72e..91874c0 100644
--- a/criu/cr-restore.c
+++ b/criu/cr-restore.c
@@ -1323,6 +1323,50 @@ static int create_children_and_session(void)
return 0;
}
+static int show_pstree(pid_t p, int level)
+{
+ pid_t *ch;
+ int i, nr_ch, ret;
+ char cmd[80];
+ int fd, len, llen;
+
+ /* limit output to a single line on a terminal */
+ llen = 79 - printf("%*s%d ", level*2, level ? "\\_" : "", p);
+
+ fd = open_proc(p, "cmdline");
+ if (fd < 0)
+ return -1;
+ len = read(fd, cmd, sizeof(cmd) - 1);
+ close(fd);
+
+ if (len > 0) {
+ if (len > llen) {
+ len = llen;
+ // ellipsis
+ cmd[len - 1] = '.';
+ cmd[len - 2] = '.';
+ }
+ for (i = 0; i < len; i++)
+ if (cmd[i] == '\0')
+ cmd[i] = ' ';
+ cmd[len] = '\0';
+ puts(cmd);
+ } else {
+ puts("???");
+ }
+
+ ret = parse_children(p, &ch, &nr_ch);
+ if (ret < 0)
+ return ret;
+
+ for (i = 0; i < nr_ch; i++) {
+ show_pstree(ch[i], level+1);
+ }
+
+ xfree(ch);
+ return 0;
+}
+
static int restore_task_with_children(void *_arg)
{
struct cr_clone_arg *ca = _arg;
@@ -1351,6 +1395,7 @@ static int restore_task_with_children(void *_arg)
pid = getpid();
if (vpid(current) != pid) {
pr_err("Pid %d do not match expected %d\n", pid, vpid(current));
+ show_pstree(1, 0);
set_task_cr_err(EEXIST);
goto err;
}
--
2.9.3
More information about the CRIU
mailing list