forked from qt-creator/qt-creator
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 <hjk@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
@@ -24,6 +24,7 @@
|
||||
|
||||
#ifdef Q_OS_LINUX
|
||||
#include <sys/ptrace.h>
|
||||
#include <sys/wait.h>
|
||||
#endif
|
||||
|
||||
#include <iostream>
|
||||
@@ -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
|
||||
}
|
||||
|
Reference in New Issue
Block a user