Debugger: Remove non-const access to RunParameters

The idea is that they shouldn't change after start() to
be re-usable for an additional run later.

Change-Id: I272fc975657b0d8b5b13a07d58bd0b626868d32e
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
hjk
2017-09-19 17:36:12 +02:00
parent 526e217ce9
commit 63e2f9ccdb
3 changed files with 35 additions and 45 deletions

View File

@@ -533,14 +533,11 @@ void DebuggerEngine::start()
fp->setKeepOnFinish(FutureProgress::HideOnFinish); fp->setKeepOnFinish(FutureProgress::HideOnFinish);
d->m_progress.reportStarted(); d->m_progress.reportStarted();
DebuggerRunParameters &rp = runParameters(); const DebuggerRunParameters &rp = runParameters();
d->m_inferiorPid = rp.attachPID.isValid() ? rp.attachPID : ProcessHandle(); d->m_inferiorPid = rp.attachPID.isValid() ? rp.attachPID : ProcessHandle();
if (d->m_inferiorPid.isValid()) if (d->m_inferiorPid.isValid())
runControl()->setApplicationProcessHandle(d->m_inferiorPid); runControl()->setApplicationProcessHandle(d->m_inferiorPid);
if (isNativeMixedActive())
rp.inferior.environment.set("QV4_FORCE_INTERPRETER", "1");
action(OperateByInstruction)->setEnabled(hasCapability(DisassemblerCapability)); action(OperateByInstruction)->setEnabled(hasCapability(DisassemblerCapability));
QTC_ASSERT(state() == DebuggerNotReady || state() == DebuggerFinished, QTC_ASSERT(state() == DebuggerNotReady || state() == DebuggerFinished,
@@ -631,11 +628,6 @@ const DebuggerRunParameters &DebuggerEngine::runParameters() const
return runTool()->runParameters(); return runTool()->runParameters();
} }
DebuggerRunParameters &DebuggerEngine::runParameters()
{
return runTool()->runParameters();
}
DebuggerState DebuggerEngine::state() const DebuggerState DebuggerEngine::state() const
{ {
return d->m_state; return d->m_state;
@@ -728,7 +720,6 @@ void DebuggerEnginePrivate::doSetupEngine()
{ {
m_engine->showMessage("CALL: SETUP ENGINE"); m_engine->showMessage("CALL: SETUP ENGINE");
QTC_ASSERT(state() == EngineSetupRequested, qDebug() << m_engine << state()); QTC_ASSERT(state() == EngineSetupRequested, qDebug() << m_engine << state());
m_engine->validateExecutable();
m_engine->setupEngine(); m_engine->setupEngine();
} }
@@ -1754,42 +1745,30 @@ void DebuggerEngine::setStateDebugging(bool on)
d->m_isStateDebugging = on; d->m_isStateDebugging = on;
} }
void DebuggerEngine::validateExecutable() void DebuggerRunParameters::validateExecutable()
{ {
DebuggerRunParameters *sp = &runParameters();
if (sp->skipExecutableValidation)
return;
if (!sp->isCppDebugging)
return;
QString symbolFile = sp->symbolFile;
if (symbolFile.isEmpty())
symbolFile = sp->inferior.executable;
if (symbolFile.isEmpty())
return;
const bool warnOnRelease = boolSetting(WarnOnReleaseBuilds); const bool warnOnRelease = boolSetting(WarnOnReleaseBuilds);
bool warnOnInappropriateDebugger = false; bool warnOnInappropriateDebugger = false;
QString detailedWarning; QString detailedWarning;
switch (sp->toolChainAbi.binaryFormat()) { switch (toolChainAbi.binaryFormat()) {
case Abi::PEFormat: { case Abi::PEFormat: {
QString preferredDebugger; QString preferredDebugger;
if (sp->toolChainAbi.osFlavor() == Abi::WindowsMSysFlavor) { if (toolChainAbi.osFlavor() == Abi::WindowsMSysFlavor) {
if (sp->cppEngineType == CdbEngineType) if (cppEngineType == CdbEngineType)
preferredDebugger = "GDB"; preferredDebugger = "GDB";
} else if (sp->cppEngineType != CdbEngineType) { } else if (cppEngineType != CdbEngineType) {
// osFlavor() is MSVC, so the recommended debugger is CDB // osFlavor() is MSVC, so the recommended debugger is CDB
preferredDebugger = "CDB"; preferredDebugger = "CDB";
} }
if (!preferredDebugger.isEmpty()) { if (!preferredDebugger.isEmpty()) {
warnOnInappropriateDebugger = true; warnOnInappropriateDebugger = true;
detailedWarning = tr( detailedWarning = DebuggerEngine::tr(
"The inferior is in the Portable Executable format.\n" "The inferior is in the Portable Executable format.\n"
"Selecting %1 as debugger would improve the debugging " "Selecting %1 as debugger would improve the debugging "
"experience for this binary format.").arg(preferredDebugger); "experience for this binary format.").arg(preferredDebugger);
break; break;
} }
if (warnOnRelease && sp->cppEngineType == CdbEngineType) { if (warnOnRelease && cppEngineType == CdbEngineType) {
if (!symbolFile.endsWith(".exe", Qt::CaseInsensitive)) if (!symbolFile.endsWith(".exe", Qt::CaseInsensitive))
symbolFile.append(".exe"); symbolFile.append(".exe");
QString errorMessage; QString errorMessage;
@@ -1806,9 +1785,9 @@ void DebuggerEngine::validateExecutable()
break; break;
} }
case Abi::ElfFormat: { case Abi::ElfFormat: {
if (sp->cppEngineType == CdbEngineType) { if (cppEngineType == CdbEngineType) {
warnOnInappropriateDebugger = true; warnOnInappropriateDebugger = true;
detailedWarning = tr( detailedWarning = DebuggerEngine::tr(
"The inferior is in the ELF format.\n" "The inferior is in the ELF format.\n"
"Selecting GDB or LLDB as debugger would improve the debugging " "Selecting GDB or LLDB as debugger would improve the debugging "
"experience for this binary format."); "experience for this binary format.");
@@ -1881,7 +1860,7 @@ void DebuggerEngine::validateExecutable()
QRegExp exp = itExp->first; QRegExp exp = itExp->first;
int index = exp.indexIn(string); int index = exp.indexIn(string);
if (index != -1) { if (index != -1) {
sp->sourcePathMap.insert(string.left(index) + exp.cap(1), itExp->second); sourcePathMap.insert(string.left(index) + exp.cap(1), itExp->second);
found = true; found = true;
break; break;
} }
@@ -1900,8 +1879,9 @@ void DebuggerEngine::validateExecutable()
return; return;
foreach (const QByteArray &name, interesting) { foreach (const QByteArray &name, interesting) {
const QString found = seen.contains(name) ? tr("Found.") : tr("Not found."); const QString found = seen.contains(name) ? DebuggerEngine::tr("Found.")
detailedWarning.append('\n' + tr("Section %1: %2").arg(QString::fromUtf8(name)).arg(found)); : DebuggerEngine::tr("Not found.");
detailedWarning.append('\n' + DebuggerEngine::tr("Section %1: %2").arg(QString::fromUtf8(name)).arg(found));
} }
break; break;
} }
@@ -1909,14 +1889,14 @@ void DebuggerEngine::validateExecutable()
return; return;
} }
if (warnOnInappropriateDebugger) { if (warnOnInappropriateDebugger) {
AsynchronousMessageBox::information(tr("Warning"), AsynchronousMessageBox::information(DebuggerEngine::tr("Warning"),
tr("The selected debugger may be inappropriate for the inferior.\n" DebuggerEngine::tr("The selected debugger may be inappropriate for the inferior.\n"
"Examining symbols and setting breakpoints by file name and line number " "Examining symbols and setting breakpoints by file name and line number "
"may fail.\n") "may fail.\n")
+ '\n' + detailedWarning); + '\n' + detailedWarning);
} else if (warnOnRelease) { } else if (warnOnRelease) {
AsynchronousMessageBox::information(tr("Warning"), AsynchronousMessageBox::information(DebuggerEngine::tr("Warning"),
tr("This does not seem to be a \"Debug\" build.\n" DebuggerEngine::tr("This does not seem to be a \"Debug\" build.\n"
"Setting breakpoints by file name and line number may fail.") "Setting breakpoints by file name and line number may fail.")
+ '\n' + detailedWarning); + '\n' + detailedWarning);
} }
@@ -2011,10 +1991,8 @@ void DebuggerEngine::checkState(DebuggerState state, const char *file, int line)
bool DebuggerEngine::isNativeMixedEnabled() const bool DebuggerEngine::isNativeMixedEnabled() const
{ {
if (DebuggerRunTool *rt = runTool()) { if (DebuggerRunTool *rt = runTool())
const DebuggerRunParameters &runParams = rt->runParameters(); return rt->runParameters().isNativeMixedDebugging();
return runParams.nativeMixedEnabled && runParams.isQmlDebugging;
}
return false; return false;
} }
@@ -2033,6 +2011,11 @@ bool DebuggerEngine::isNativeMixedActiveFrame() const
return frame.language == QmlLanguage; return frame.language == QmlLanguage;
} }
bool DebuggerRunParameters::isNativeMixedDebugging() const
{
return nativeMixedEnabled && isCppDebugging && isQmlDebugging;
}
} // namespace Internal } // namespace Internal
} // namespace Debugger } // namespace Debugger

View File

@@ -156,6 +156,9 @@ public:
bool nativeMixedEnabled = false; bool nativeMixedEnabled = false;
bool isNativeMixedDebugging() const;
void validateExecutable();
Utils::MacroExpander *macroExpander = 0; Utils::MacroExpander *macroExpander = 0;
// For Debugger testing. // For Debugger testing.
@@ -239,7 +242,7 @@ public:
virtual ~DebuggerEngine(); virtual ~DebuggerEngine();
const DebuggerRunParameters &runParameters() const; const DebuggerRunParameters &runParameters() const;
DebuggerRunParameters &runParameters();
virtual void setRunTool(DebuggerRunTool *runTool); virtual void setRunTool(DebuggerRunTool *runTool);
DebuggerRunTool *runTool() const; DebuggerRunTool *runTool() const;
@@ -471,8 +474,6 @@ protected:
bool isStateDebugging() const; bool isStateDebugging() const;
void setStateDebugging(bool on); void setStateDebugging(bool on);
void validateExecutable();
virtual void setupSlaveInferior(); virtual void setupSlaveInferior();
virtual void setupSlaveEngine(); virtual void setupSlaveEngine();
virtual void runSlaveEngine(); virtual void runSlaveEngine();

View File

@@ -728,6 +728,12 @@ bool DebuggerRunTool::fixupParameters()
rp.useTerminal = false; rp.useTerminal = false;
} }
if (rp.isNativeMixedDebugging())
rp.inferior.environment.set("QV4_FORCE_INTERPRETER", "1");
if (rp.isCppDebugging && !rp.skipExecutableValidation)
rp.validateExecutable();
return true; return true;
} }