diff options
Diffstat (limited to 'src/plugins/debugger/debuggerplugin.cpp')
-rw-r--r-- | src/plugins/debugger/debuggerplugin.cpp | 68 |
1 files changed, 44 insertions, 24 deletions
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 27ece76ae16..0df27ac8198 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -567,8 +567,10 @@ public: explicit AbiKitMatcher(const QList<Abi> &abis) : m_abis(abis) {} bool matches(const Kit *p) const { - if (const ToolChain *tc = ToolChainKitInformation::toolChain(p)) - return m_abis.contains(tc->targetAbi()); + if (const ToolChain *tc = ToolChainKitInformation::toolChain(p)) { + return m_abis.contains(tc->targetAbi()) + && DebuggerKitInformation::isValidDebugger(p); + } return false; } @@ -584,7 +586,7 @@ public: { if (const ToolChain *tc = ToolChainKitInformation::toolChain(p)) foreach (const Abi &a, m_abis) - if (a.isCompatibleWith(tc->targetAbi())) + if (a.isCompatibleWith(tc->targetAbi()) && DebuggerKitInformation::isValidDebugger(p)) return true; return false; } @@ -600,18 +602,14 @@ public: bool matches(const Kit *k) const { - const ToolChain *tc = ToolChainKitInformation::toolChain(k); - QTC_ASSERT(tc, return false); - const Abi abi = tc->targetAbi(); - if (abi.architecture() != Abi::X86Architecture - || abi.os() != Abi::WindowsOS - || abi.binaryFormat() != Abi::PEFormat) - return false; - if (abi.osFlavor() == Abi::WindowsMSysFlavor - || abi.osFlavor() == Abi::WindowsCEFlavor) - return false; - if (m_wordWidth && abi.wordWidth() != m_wordWidth) + if (DebuggerKitInformation::engineType(k) != CdbEngineType + || !DebuggerKitInformation::isValidDebugger(k)) { return false; + } + if (m_wordWidth) { + const ToolChain *tc = ToolChainKitInformation::toolChain(k); + return tc && m_wordWidth == tc->targetAbi().wordWidth(); + } return true; } @@ -634,7 +632,7 @@ private: const char m_wordWidth; }; -void fillParameters(DebuggerStartParameters *sp, const Kit *kit /* = 0 */) +bool fillParameters(DebuggerStartParameters *sp, const Kit *kit /* = 0 */, QString *errorMessage /* = 0 */) { if (!kit) { // This code can only be reached when starting via the command line @@ -664,6 +662,27 @@ void fillParameters(DebuggerStartParameters *sp, const Kit *kit /* = 0 */) kit = KitManager::instance()->defaultKit(); } + // Verify that debugger and profile are valid + if (!kit) { + sp->startMode = NoStartMode; + if (errorMessage) + *errorMessage = DebuggerKitInformation::tr("No kit found."); + return false; + } + const QList<ProjectExplorer::Task> tasks = DebuggerKitInformation::validateDebugger(kit); + if (!tasks.isEmpty()) { + sp->startMode = NoStartMode; + if (errorMessage) { + foreach (const ProjectExplorer::Task &t, tasks) { + if (errorMessage->isEmpty()) + errorMessage->append(QLatin1Char('\n')); + errorMessage->append(t.description); + } + } + return false; + } + + sp->cppEngineType = DebuggerKitInformation::engineType(kit); sp->sysRoot = SysRootKitInformation::sysRoot(kit).toString(); sp->debuggerCommand = DebuggerKitInformation::debuggerCommand(kit).toString(); @@ -676,6 +695,7 @@ void fillParameters(DebuggerStartParameters *sp, const Kit *kit /* = 0 */) sp->connParams = device->sshParameters(); sp->remoteChannel = sp->connParams.host + QLatin1Char(':') + QString::number(sp->connParams.port); } + return true; } static TextEditor::ITextEditor *currentTextEditor() @@ -1438,7 +1458,8 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it, } } } - fillParameters(&sp, kit); + if (fillParameters(&sp, kit, errorMessage)) + return false; if (sp.startMode == StartExternal) { sp.displayName = tr("Executable file \"%1\"").arg(sp.executable); sp.startMessage = tr("Debugging file %1.").arg(sp.executable); @@ -1458,7 +1479,8 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it, return false; } DebuggerStartParameters sp; - fillParameters(&sp, CdbMatcher::findUniversalCdbKit()); + if (!fillParameters(&sp, CdbMatcher::findUniversalCdbKit(), errorMessage)) + return false; sp.startMode = AttachCrashedExternal; sp.crashParameter = it->section(QLatin1Char(':'), 0, 0); sp.attachPID = it->section(QLatin1Char(':'), 1, 1).toULongLong(); @@ -1596,7 +1618,7 @@ void DebuggerPluginPrivate::attachCore() DebuggerStartParameters sp; QString display = dlg.isLocal() ? dlg.localCoreFile() : dlg.remoteCoreFile(); - fillParameters(&sp, dlg.kit()); + QTC_ASSERT(fillParameters(&sp, dlg.kit()), return); sp.masterEngineType = GdbEngineType; sp.executable = dlg.localExecutableFile(); sp.coreFile = dlg.localCoreFile(); @@ -1612,8 +1634,7 @@ void DebuggerPluginPrivate::startRemoteCdbSession() const QString connectionKey = _("CdbRemoteConnection"); DebuggerStartParameters sp; Kit *kit = CdbMatcher::findUniversalCdbKit(); - QTC_ASSERT(kit, return); - fillParameters(&sp, kit); + QTC_ASSERT(kit && fillParameters(&sp, kit), return); sp.startMode = AttachToRemoteServer; sp.closeMode = KillAtClose; StartRemoteCdbDialog dlg(mainWindow()); @@ -1683,7 +1704,7 @@ void DebuggerPluginPrivate::attachToProcess(bool startServerOnly) if (device->type() == ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE) { DebuggerStartParameters sp; - fillParameters(&sp, kit); + QTC_ASSERT(fillParameters(&sp, kit), return); sp.attachPID = process.pid; sp.displayName = tr("Process %1").arg(process.pid); sp.executable = process.exe; @@ -1708,7 +1729,7 @@ void DebuggerPluginPrivate::attachExternalApplication(ProjectExplorer::RunContro if (const RunConfiguration *runConfiguration = rc->runConfiguration()) if (const Target *target = runConfiguration->target()) kit = target->kit(); - fillParameters(&sp, kit); + QTC_ASSERT(fillParameters(&sp, kit), return); DebuggerRunControlFactory::createAndScheduleRun(sp); } @@ -1731,11 +1752,10 @@ void DebuggerPluginPrivate::attachToQmlPort() return; Kit *kit = dlg.kit(); - QTC_ASSERT(kit, return); + QTC_ASSERT(kit && fillParameters(&sp, kit), return); setConfigValue(_("LastQmlServerPort"), dlg.port()); setConfigValue(_("LastProfile"), kit->id().toString()); - fillParameters(&sp, kit); sp.qmlServerAddress = sp.connParams.host; sp.qmlServerPort = dlg.port(); sp.startMode = AttachToRemoteProcess; |