forked from qt-creator/qt-creator
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 <david.schulz@qt.io>
This commit is contained in:
@@ -394,7 +394,8 @@ void DebuggerRunTool::setUseTerminal(bool on)
|
|||||||
&& debuggerSettings()->useCdbConsole.value();
|
&& debuggerSettings()->useCdbConsole.value();
|
||||||
|
|
||||||
if (on && !d->terminalRunner && !useCdbConsole) {
|
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);
|
d->terminalRunner->setRunAsRoot(m_runParameters.runAsRoot);
|
||||||
addStartDependency(d->terminalRunner);
|
addStartDependency(d->terminalRunner);
|
||||||
}
|
}
|
||||||
|
@@ -168,13 +168,12 @@ void Terminal::onSlaveReaderActivated(int fd)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
TerminalRunner::TerminalRunner(RunControl *runControl, const Runnable &stubRunnable)
|
TerminalRunner::TerminalRunner(RunControl *runControl,
|
||||||
: RunWorker(runControl)
|
const std::function<Runnable()> &stubRunnable)
|
||||||
|
: RunWorker(runControl), m_stubRunnable(stubRunnable)
|
||||||
{
|
{
|
||||||
setId("TerminalRunner");
|
setId("TerminalRunner");
|
||||||
|
|
||||||
m_stubRunnable = stubRunnable;
|
|
||||||
|
|
||||||
connect(&m_stubProc, &ConsoleProcess::processError,
|
connect(&m_stubProc, &ConsoleProcess::processError,
|
||||||
this, &TerminalRunner::stubError);
|
this, &TerminalRunner::stubError);
|
||||||
connect(&m_stubProc, &ConsoleProcess::processStarted,
|
connect(&m_stubProc, &ConsoleProcess::processStarted,
|
||||||
@@ -200,13 +199,16 @@ void TerminalRunner::setRunAsRoot(bool on)
|
|||||||
|
|
||||||
void TerminalRunner::start()
|
void TerminalRunner::start()
|
||||||
{
|
{
|
||||||
|
QTC_ASSERT(m_stubRunnable, reportFailure({}); return);
|
||||||
|
Runnable stub = m_stubRunnable();
|
||||||
|
|
||||||
if (m_runAsRoot) {
|
if (m_runAsRoot) {
|
||||||
m_stubProc.setRunAsRoot(true);
|
m_stubProc.setRunAsRoot(true);
|
||||||
RunControl::provideAskPassEntry(m_stubRunnable.environment);
|
RunControl::provideAskPassEntry(stub.environment);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_stubProc.setEnvironment(m_stubRunnable.environment);
|
m_stubProc.setEnvironment(stub.environment);
|
||||||
m_stubProc.setWorkingDirectory(m_stubRunnable.workingDirectory);
|
m_stubProc.setWorkingDirectory(stub.workingDirectory);
|
||||||
|
|
||||||
if (HostOsInfo::isWindowsHost()) {
|
if (HostOsInfo::isWindowsHost()) {
|
||||||
m_stubProc.setMode(ConsoleProcess::Suspend);
|
m_stubProc.setMode(ConsoleProcess::Suspend);
|
||||||
@@ -216,7 +218,7 @@ void TerminalRunner::start()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Error message for user is delivered via a signal.
|
// Error message for user is delivered via a signal.
|
||||||
m_stubProc.setCommand(m_stubRunnable.commandLine());
|
m_stubProc.setCommand(stub.commandLine());
|
||||||
m_stubProc.start();
|
m_stubProc.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -72,7 +72,7 @@ class TerminalRunner : public ProjectExplorer::RunWorker
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
TerminalRunner(ProjectExplorer::RunControl *runControl,
|
TerminalRunner(ProjectExplorer::RunControl *runControl,
|
||||||
const ProjectExplorer::Runnable &stubRunnable);
|
const std::function<ProjectExplorer::Runnable()> &stubRunnable);
|
||||||
|
|
||||||
qint64 applicationPid() const { return m_applicationPid; }
|
qint64 applicationPid() const { return m_applicationPid; }
|
||||||
qint64 applicationMainThreadId() const { return m_applicationMainThreadId; }
|
qint64 applicationMainThreadId() const { return m_applicationMainThreadId; }
|
||||||
@@ -89,7 +89,7 @@ private:
|
|||||||
void stubError(const QString &msg);
|
void stubError(const QString &msg);
|
||||||
|
|
||||||
Utils::ConsoleProcess m_stubProc;
|
Utils::ConsoleProcess m_stubProc;
|
||||||
ProjectExplorer::Runnable m_stubRunnable;
|
std::function<ProjectExplorer::Runnable()> m_stubRunnable;
|
||||||
qint64 m_applicationPid = 0;
|
qint64 m_applicationPid = 0;
|
||||||
qint64 m_applicationMainThreadId = 0;
|
qint64 m_applicationMainThreadId = 0;
|
||||||
bool m_runAsRoot = false;
|
bool m_runAsRoot = false;
|
||||||
|
Reference in New Issue
Block a user