From db671e820252393a1ccb1473251e4e7531cce1d4 Mon Sep 17 00:00:00 2001 From: Friedemann Kleint <Friedemann.Kleint@nokia.com> Date: Fri, 22 Oct 2010 11:27:45 +0200 Subject: [PATCH] Debugger: Avoid crashes when no C++-engine is available. Check for valid runcontrols in various places and initialize m_engine correcly. In the case of QML-Debugging, handle NoEngineType. Reviewed-by: Leandro T. C. Melo <leandro.melo@nokia.com> Reviewed-by: Kai Koehne <kai.koehne@nokia.com> Task-number: QTCREATORBUG-2086 --- src/plugins/debugger/debuggerplugin.cpp | 22 +++++++++++++--------- src/plugins/debugger/debuggerrunner.cpp | 8 +++++--- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 5a7b1b7b33f..659ec059c85 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1790,7 +1790,9 @@ void DebuggerPluginPrivate::startExternalApplication() && (sp.processArgs.front() == _("@tcf@") || sp.processArgs.front() == _("@sym@"))) sp.toolChainType = ToolChain::RVCT_ARMV5; - startDebugger(m_debuggerRunControlFactory->create(sp)); + + if (RunControl *rc = m_debuggerRunControlFactory->create(sp)) + startDebugger(rc); } void DebuggerPluginPrivate::notifyCurrentEngine(int role, const QVariant &value) @@ -1820,8 +1822,8 @@ void DebuggerPluginPrivate::attachExternalApplication sp.executable = binary; sp.crashParameter = crashParameter; sp.startMode = crashParameter.isEmpty() ? AttachExternal : AttachCrashedExternal; - DebuggerRunControl *rc = createDebugger(sp); - startDebugger(rc); + if (DebuggerRunControl *rc = createDebugger(sp)) + startDebugger(rc); } void DebuggerPluginPrivate::attachCore() @@ -1843,8 +1845,8 @@ void DebuggerPluginPrivate::attachCore(const QString &core, const QString &exe) sp.coreFile = core; sp.displayName = tr("Core file \"%1\"").arg(core); sp.startMode = AttachCore; - DebuggerRunControl *rc = createDebugger(sp); - startDebugger(rc); + if (DebuggerRunControl *rc = createDebugger(sp)) + startDebugger(rc); } void DebuggerPluginPrivate::attachRemote(const QString &spec) @@ -1856,8 +1858,8 @@ void DebuggerPluginPrivate::attachRemote(const QString &spec) sp.remoteArchitecture = spec.section('@', 2, 2); sp.displayName = tr("Remote: \"%1\"").arg(sp.remoteChannel); sp.startMode = AttachToRemote; - DebuggerRunControl *rc = createDebugger(sp); - startDebugger(rc); + if (DebuggerRunControl *rc = createDebugger(sp)) + startDebugger(rc); } void DebuggerPluginPrivate::startRemoteApplication() @@ -1902,7 +1904,8 @@ void DebuggerPluginPrivate::startRemoteApplication() sp.useServerStartScript = dlg.useServerStartScript(); sp.serverStartScript = dlg.serverStartScript(); sp.sysRoot = dlg.sysRoot(); - startDebugger(createDebugger(sp)); + if (RunControl *rc = createDebugger(sp)) + startDebugger(rc); } void DebuggerPluginPrivate::enableReverseDebuggingTriggered(const QVariant &value) @@ -1940,7 +1943,8 @@ void DebuggerPluginPrivate::attachRemoteTcf() sp.startMode = AttachTcf; if (dlg.useServerStartScript()) sp.serverStartScript = dlg.serverStartScript(); - startDebugger(createDebugger(sp)); + if (RunControl *rc = createDebugger(sp)) + startDebugger(rc); } bool DebuggerPluginPrivate::attachCmdLine() diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 03b2853f938..89ffcc13701 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -276,7 +276,8 @@ unsigned DebuggerRunnerPrivate::enabledEngines() const DebuggerRunnerPrivate::DebuggerRunnerPrivate(RunConfiguration *runConfiguration, unsigned enabledEngines) : - m_myRunConfiguration(runConfiguration) + m_engine(0) + , m_myRunConfiguration(runConfiguration) , m_running(false) , m_cmdLineEnabledEngines(enabledEngines) { @@ -439,10 +440,11 @@ void DebuggerRunControl::createEngine(const DebuggerStartParameters &startParams && !sp.executable.isEmpty()) engineType = engineForExecutable(enabledEngineTypes, sp.executable); - if (!engineType) + if (engineType == NoEngineType) engineType = engineForMode(enabledEngineTypes, sp.startMode); - if (engineType != QmlEngineType && (activeLangs & QmlLanguage)) { + if ((engineType != QmlEngineType && engineType != NoEngineType) + && (activeLangs & QmlLanguage)) { if (activeLangs & CppLanguage) { sp.cppEngineType = engineType; engineType = QmlCppEngineType; -- GitLab