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