From f13d9cc736aa3d62018fa596231255f5617fff51 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Wed, 9 Aug 2023 10:14:04 +0200 Subject: [PATCH] ProcessStub: Wait for detach to finish Without calling waitpid() after detaching from the inferior a race condition could occur where the ptrace(...) call would finish before it was actually detached, leading to the following gdb to fail attaching as the stub was still attached to it. Calling waitpid here solves the race condition. Fixes: QTCREATORBUG-29463 Change-Id: Ia1d79a18a96078bbf72589bebbc7d7ac027dea0d Reviewed-by: hjk Reviewed-by: --- src/tools/process_stub/main.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/tools/process_stub/main.cpp b/src/tools/process_stub/main.cpp index 00312b833f6..dfd9ce5613d 100644 --- a/src/tools/process_stub/main.cpp +++ b/src/tools/process_stub/main.cpp @@ -24,6 +24,7 @@ #ifdef Q_OS_LINUX #include +#include #endif #include @@ -221,7 +222,23 @@ void onInferiorStarted() if (!debugMode) sendPid(inferiorId); #else + qCInfo(log) << "Detaching ..."; ptrace(PTRACE_DETACH, inferiorId, 0, SIGSTOP); + + // Wait until the process actually finished detaching + int status = 0; + waitpid(inferiorId, &status, WUNTRACED); + if (log().isInfoEnabled()) { + if (WIFEXITED(status)) + qCInfo(log) << "inferior exited, status=" << WEXITSTATUS(status); + else if (WIFSIGNALED(status)) + qCInfo(log) << "inferior killed by signal" << WTERMSIG(status); + else if (WIFSTOPPED(status)) + qCInfo(log) << "inferior stopped by signal" << WSTOPSIG(status); + else if (WIFCONTINUED(status)) + qCInfo(log) << "inferior continued"; + } + sendPid(inferiorId); #endif }