From 3560a86c2e436977fab0c36b7dbaa8583bce1712 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 9 Mar 2021 11:53:18 +0100 Subject: [PATCH] Debugger: Delay evaluation of stub runnable environment There can be modifications in the environment between the decision to use a terminal and its start. We want them taken into account. Change-Id: I5622614c5fac3bdd8167c29e7b618b5e42a28287 Reviewed-by: David Schulz --- src/plugins/debugger/debuggerruncontrol.cpp | 3 ++- src/plugins/debugger/terminal.cpp | 18 ++++++++++-------- src/plugins/debugger/terminal.h | 4 ++-- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 50660ddd579..3ddd523e014 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -394,7 +394,8 @@ void DebuggerRunTool::setUseTerminal(bool on) && debuggerSettings()->useCdbConsole.value(); if (on && !d->terminalRunner && !useCdbConsole) { - d->terminalRunner = new TerminalRunner(runControl(), m_runParameters.inferior); + d->terminalRunner = + new TerminalRunner(runControl(), [this] { return m_runParameters.inferior; }); d->terminalRunner->setRunAsRoot(m_runParameters.runAsRoot); addStartDependency(d->terminalRunner); } diff --git a/src/plugins/debugger/terminal.cpp b/src/plugins/debugger/terminal.cpp index 24b1f72f23d..7f4996cd5b6 100644 --- a/src/plugins/debugger/terminal.cpp +++ b/src/plugins/debugger/terminal.cpp @@ -168,13 +168,12 @@ void Terminal::onSlaveReaderActivated(int fd) #endif } -TerminalRunner::TerminalRunner(RunControl *runControl, const Runnable &stubRunnable) - : RunWorker(runControl) +TerminalRunner::TerminalRunner(RunControl *runControl, + const std::function &stubRunnable) + : RunWorker(runControl), m_stubRunnable(stubRunnable) { setId("TerminalRunner"); - m_stubRunnable = stubRunnable; - connect(&m_stubProc, &ConsoleProcess::processError, this, &TerminalRunner::stubError); connect(&m_stubProc, &ConsoleProcess::processStarted, @@ -200,13 +199,16 @@ void TerminalRunner::setRunAsRoot(bool on) void TerminalRunner::start() { + QTC_ASSERT(m_stubRunnable, reportFailure({}); return); + Runnable stub = m_stubRunnable(); + if (m_runAsRoot) { m_stubProc.setRunAsRoot(true); - RunControl::provideAskPassEntry(m_stubRunnable.environment); + RunControl::provideAskPassEntry(stub.environment); } - m_stubProc.setEnvironment(m_stubRunnable.environment); - m_stubProc.setWorkingDirectory(m_stubRunnable.workingDirectory); + m_stubProc.setEnvironment(stub.environment); + m_stubProc.setWorkingDirectory(stub.workingDirectory); if (HostOsInfo::isWindowsHost()) { m_stubProc.setMode(ConsoleProcess::Suspend); @@ -216,7 +218,7 @@ void TerminalRunner::start() } // Error message for user is delivered via a signal. - m_stubProc.setCommand(m_stubRunnable.commandLine()); + m_stubProc.setCommand(stub.commandLine()); m_stubProc.start(); } diff --git a/src/plugins/debugger/terminal.h b/src/plugins/debugger/terminal.h index ceacf3fddd7..896fec855aa 100644 --- a/src/plugins/debugger/terminal.h +++ b/src/plugins/debugger/terminal.h @@ -72,7 +72,7 @@ class TerminalRunner : public ProjectExplorer::RunWorker { public: TerminalRunner(ProjectExplorer::RunControl *runControl, - const ProjectExplorer::Runnable &stubRunnable); + const std::function &stubRunnable); qint64 applicationPid() const { return m_applicationPid; } qint64 applicationMainThreadId() const { return m_applicationMainThreadId; } @@ -89,7 +89,7 @@ private: void stubError(const QString &msg); Utils::ConsoleProcess m_stubProc; - ProjectExplorer::Runnable m_stubRunnable; + std::function m_stubRunnable; qint64 m_applicationPid = 0; qint64 m_applicationMainThreadId = 0; bool m_runAsRoot = false;