From bd44fb1248d81c47e0029f36601f0d970b674871 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Tue, 22 Feb 2011 12:58:32 +0100 Subject: [PATCH] debugger: move gdb binary list to common options page (unfinished) --- src/plugins/debugger/commonoptionspage.cpp | 493 ++++++++++++++++++++ src/plugins/debugger/commonoptionspage.h | 122 +++++ src/plugins/debugger/debuggercore.h | 2 +- src/plugins/debugger/debuggerplugin.cpp | 18 +- src/plugins/debugger/debuggerrunner.cpp | 5 +- src/plugins/debugger/gdb/gdbengine.cpp | 2 +- src/plugins/debugger/gdb/gdboptionspage.cpp | 226 +-------- src/plugins/debugger/gdb/gdboptionspage.h | 10 - 8 files changed, 632 insertions(+), 246 deletions(-) create mode 100644 src/plugins/debugger/commonoptionspage.cpp create mode 100644 src/plugins/debugger/commonoptionspage.h diff --git a/src/plugins/debugger/commonoptionspage.cpp b/src/plugins/debugger/commonoptionspage.cpp new file mode 100644 index 00000000000..19e2c52f2f7 --- /dev/null +++ b/src/plugins/debugger/commonoptionspage.cpp @@ -0,0 +1,493 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** No Commercial Usage +** +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +**************************************************************************/ + +#include "commonoptionspage.h" + +#include "debuggeractions.h" +#include "debuggerconstants.h" +#include "debuggercore.h" +#include "debuggerstringutils.h" + +#include <coreplugin/icore.h> +#include <coreplugin/manhattanstyle.h> + +#include <projectexplorer/projectexplorer.h> +#include <projectexplorer/toolchainmanager.h> +#include <projectexplorer/abi.h> + +#include <QtCore/QFileInfo> +#include <QtCore/QTextStream> + +using namespace Core; +using namespace Debugger::Constants; +using namespace ProjectExplorer; + +namespace Debugger { +namespace Internal { + +static const char *DEBUGGER_MAPPING_ARRAY = "GdbMapping"; +static const char *DEBUGGER_ABI_KEY = "Abi"; +static const char *DEBUGGER_BINARY_KEY = "Binary"; + +/////////////////////////////////////////////////////////////////////// +// +// CommonOptionsPage +// +/////////////////////////////////////////////////////////////////////// + +CommonOptionsPage::CommonOptionsPage() +{ + m_abiToDebuggerMapChanged = true; +} + +QString CommonOptionsPage::id() const +{ + return _(DEBUGGER_COMMON_SETTINGS_ID); +} + +QString CommonOptionsPage::displayName() const +{ + return QCoreApplication::translate("Debugger", DEBUGGER_COMMON_SETTINGS_NAME);} + +QString CommonOptionsPage::category() const +{ + return _(DEBUGGER_SETTINGS_CATEGORY); +} + +QString CommonOptionsPage::displayCategory() const +{ + return QCoreApplication::translate("Debugger", DEBUGGER_SETTINGS_TR_CATEGORY);} + +QIcon CommonOptionsPage::categoryIcon() const +{ + return QIcon(QLatin1String(DEBUGGER_COMMON_SETTINGS_CATEGORY_ICON)); +} + +void CommonOptionsPage::apply() +{ + m_group.apply(ICore::instance()->settings()); +} + +void CommonOptionsPage::finish() +{ + m_group.finish(); +} + +QString CommonOptionsPage::debuggerForAbi(const QString &abi) const +{ + return m_abiToDebuggerMap.value(abi); +} + +QWidget *CommonOptionsPage::createPage(QWidget *parent) +{ + QWidget *w = new QWidget(parent); + m_ui.setupUi(w); + m_group.clear(); + + m_group.insert(debuggerCore()->action(ListSourceFiles), + m_ui.checkBoxListSourceFiles); + m_group.insert(debuggerCore()->action(UseAlternatingRowColors), + m_ui.checkBoxUseAlternatingRowColors); + m_group.insert(debuggerCore()->action(UseToolTipsInMainEditor), + m_ui.checkBoxUseToolTipsInMainEditor); + m_group.insert(debuggerCore()->action(CloseBuffersOnExit), + m_ui.checkBoxCloseBuffersOnExit); + m_group.insert(debuggerCore()->action(SwitchModeOnExit), + m_ui.checkBoxSwitchModeOnExit); + m_group.insert(debuggerCore()->action(AutoDerefPointers), 0); + m_group.insert(debuggerCore()->action(UseToolTipsInLocalsView), 0); + m_group.insert(debuggerCore()->action(UseToolTipsInBreakpointsView), 0); + m_group.insert(debuggerCore()->action(UseAddressInBreakpointsView), 0); + m_group.insert(debuggerCore()->action(UseAddressInStackView), 0); + m_group.insert(debuggerCore()->action(MaximalStackDepth), + m_ui.spinBoxMaximalStackDepth); + m_group.insert(debuggerCore()->action(ShowStdNamespace), 0); + m_group.insert(debuggerCore()->action(ShowQtNamespace), 0); + m_group.insert(debuggerCore()->action(SortStructMembers), 0); + m_group.insert(debuggerCore()->action(LogTimeStamps), 0); + m_group.insert(debuggerCore()->action(VerboseLog), 0); + m_group.insert(debuggerCore()->action(BreakOnThrow), 0); + m_group.insert(debuggerCore()->action(BreakOnCatch), 0); +#ifdef Q_OS_WIN + Utils::SavedAction *registerAction = debuggerCore()->action(RegisterForPostMortem); + m_group.insert(registerAction, + m_ui.checkBoxRegisterForPostMortem); + connect(registerAction, SIGNAL(toggled(bool)), + m_ui.checkBoxRegisterForPostMortem, SLOT(setChecked(bool))); +#endif + + if (m_searchKeywords.isEmpty()) { + QLatin1Char sep(' '); + QTextStream(&m_searchKeywords) + << sep << m_ui.checkBoxUseAlternatingRowColors->text() + << sep << m_ui.checkBoxUseToolTipsInMainEditor->text() + << sep << m_ui.checkBoxListSourceFiles->text() +#ifdef Q_OS_WIN + << sep << m_ui.checkBoxRegisterForPostMortem->text() +#endif + << sep << m_ui.checkBoxCloseBuffersOnExit->text() + << sep << m_ui.checkBoxSwitchModeOnExit->text() + << sep << m_ui.labelMaximalStackDepth->text() + ; + m_searchKeywords.remove(QLatin1Char('&')); + } +#ifndef Q_OS_WIN + m_ui.checkBoxRegisterForPostMortem->setVisible(false); +#endif + + // Tool + connect(ToolChainManager::instance(), + SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)), + SLOT(handleToolChainAdditions(ProjectExplorer::ToolChain*))); + + connect(ToolChainManager::instance(), + SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)), + SLOT(handleToolChainRemovals(ProjectExplorer::ToolChain*))); + + // Update mapping now that toolchains are available + QList<ToolChain *> tcs = ToolChainManager::instance()->toolChains(); + + QStringList abiList; + foreach (ToolChain *tc, tcs) { + const QString abi = tc->targetAbi().toString(); + if (!abiList.contains(abi)) + abiList.append(abi); + if (!m_abiToDebuggerMap.contains(abi)) + handleToolChainAdditions(tc); + } + + QStringList toRemove; + for (QMap<QString, QString>::const_iterator i = m_abiToDebuggerMap.constBegin(); + i != m_abiToDebuggerMap.constEnd(); ++i) { + if (!abiList.contains(i.key())) + toRemove.append(i.key()); + } + + foreach (const QString &key, toRemove) + m_abiToDebuggerMap.remove(key); + + //m_ui->gdbChooserWidget->setGdbMapping(m_abiToDebuggerMap); + + return w; +} + +bool CommonOptionsPage::matches(const QString &s) const +{ + return m_searchKeywords.contains(s, Qt::CaseInsensitive); +} + +void CommonOptionsPage::readSettings() /* static */ +{ + // FIXME: Convert old settings! + QSettings *settings = Core::ICore::instance()->settings(); + + m_abiToDebuggerMap.clear(); + + int size = settings->beginReadArray(DEBUGGER_MAPPING_ARRAY); + for (int i = 0; i < size; ++i) { + settings->setArrayIndex(i); + Abi abi(settings->value(DEBUGGER_ABI_KEY).toString()); + if (!abi.isValid()) + continue; + QString binary = settings->value(DEBUGGER_BINARY_KEY).toString(); + if (binary.isEmpty()) + continue; + m_abiToDebuggerMap.insert(abi.toString(), binary); + } + settings->endArray(); + + // Map old settings (pre 2.2): + const QChar separator = QLatin1Char(','); + const QString keyRoot = QLatin1String("GdbBinaries/GdbBinaries"); + for (int i = 1; ; i++) { + const QString value = settings->value(keyRoot + QString::number(i)).toString(); + if (value.isEmpty()) + break; + // Split apart comma-separated binary and its numerical toolchains. + QStringList tokens = value.split(separator); + if (tokens.size() < 2) + break; + + const QString binary = tokens.front(); + // Skip non-existent absolute binaries allowing for upgrades by the installer. + // Force a rewrite of the settings file. + const QFileInfo binaryInfo(binary); + if (binaryInfo.isAbsolute() && !binaryInfo.isExecutable()) { + const QString msg = QString::fromLatin1("Warning: The gdb binary '%1' does not exist, skipping.\n").arg(binary); + qWarning("%s", qPrintable(msg)); + continue; + } + + // Create entries for all toolchains. + tokens.pop_front(); + foreach (const QString &t, tokens) { + // Paranoia: Check if the there is already a binary configured for the toolchain. + QString abi; + switch (t.toInt()) + { + case 0: // GCC + case 1: // Linux ICC +#ifndef Q_OS_WIN + abi = Abi::hostAbi().toString(); +#endif + break; + case 2: // MinGW + case 3: // MSVC + case 4: // WINCE +#ifdef Q_OS_WIN + abi = Abi::hostAbi().toString(); +#endif + break; + case 5: // WINSCW + abi = Abi(Abi::ARM, Abi::Symbian, + Abi::Symbian_emulator, + Abi::Format_ELF, + 32).toString(); + break; + case 6: // GCCE + case 7: // RVCT 2, ARM v5 + case 8: // RVCT 2, ARM v6 + case 11: // RVCT GNUPOC + case 12: // RVCT 4, ARM v5 + case 13: // RVCT 4, ARM v6 + abi = Abi(Abi::ARM, Abi::Symbian, + Abi::Symbian_device, + Abi::Format_ELF, + 32).toString(); + break; + case 9: // GCC Maemo5 + abi = Abi(Abi::ARM, Abi::Linux, + Abi::Linux_maemo, + Abi::Format_ELF, + 32).toString(); + + break; + case 14: // GCC Harmattan + abi = Abi(Abi::ARM, Abi::Linux, + Abi::Linux_harmattan, + Abi::Format_ELF, + 32).toString(); + break; + case 15: // GCC Meego + abi = Abi(Abi::ARM, Abi::Linux, + Abi::Linux_meego, + Abi::Format_ELF, + 32).toString(); + break; + default: + break; + } + if (abi.isEmpty() || m_abiToDebuggerMap.contains(abi)) + continue; + + m_abiToDebuggerMap.insert(abi, binary); + } + } + + m_abiToDebuggerMapChanged = false; +} + +void CommonOptionsPage::writeSettings() /* static */ +{ + if (!m_abiToDebuggerMapChanged) + return; + + QSettings *settings = Core::ICore::instance()->settings(); + + settings->beginWriteArray(DEBUGGER_MAPPING_ARRAY); + + int index = 0; + for (QMap<QString, QString>::const_iterator i = m_abiToDebuggerMap.constBegin(); + i != m_abiToDebuggerMap.constEnd(); ++i) { + if (i.value().isEmpty()) + continue; + + settings->setArrayIndex(index); + ++index; + + settings->setValue(DEBUGGER_ABI_KEY, i.key()); + settings->setValue(DEBUGGER_BINARY_KEY, i.value()); + } + settings->endArray(); + + m_abiToDebuggerMapChanged = false; +} + +void CommonOptionsPage::handleToolChainAdditions(ToolChain *tc) +{ + Abi tcAbi = tc->targetAbi(); + + if (tcAbi.binaryFormat() != Abi::Format_ELF + && tcAbi.binaryFormat() != Abi::Format_Mach_O + && !( tcAbi.os() == Abi::Windows + && tcAbi.osFlavor() == Abi::Windows_msys )) + return; + if (m_abiToDebuggerMap.contains(tcAbi.toString())) + return; + + QString binary; +#ifdef Q_OS_UNIX + Abi hostAbi = Abi::hostAbi(); + if (hostAbi == tcAbi) + binary = QLatin1String("gdb"); +#endif + m_abiToDebuggerMap.insert(tc->targetAbi().toString(), binary); +} + +void CommonOptionsPage::handleToolChainRemovals(ToolChain *tc) +{ + QList<ToolChain *> tcs = ToolChainManager::instance()->toolChains(); + foreach (ToolChain *current, tcs) { + if (current->targetAbi() == tc->targetAbi()) + return; + } + + m_abiToDebuggerMap.remove(tc->targetAbi().toString()); +} + + +/////////////////////////////////////////////////////////////////////// +// +// DebuggingHelperOptionPage +// +/////////////////////////////////////////////////////////////////////// + +static bool oxygenStyle() +{ + const ManhattanStyle *ms = qobject_cast<const ManhattanStyle *>(qApp->style()); + return ms && !qstrcmp("OxygenStyle", ms->baseStyle()->metaObject()->className()); +} + +QString DebuggingHelperOptionPage::id() const +{ + return _("Z.DebuggingHelper"); +} + +QString DebuggingHelperOptionPage::displayName() const +{ + return tr("Debugging Helper"); +} + +QString DebuggingHelperOptionPage::category() const +{ + return _(DEBUGGER_SETTINGS_CATEGORY); +} + +QString DebuggingHelperOptionPage::displayCategory() const +{ + return QCoreApplication::translate("Debugger", DEBUGGER_SETTINGS_TR_CATEGORY); +} + +QIcon DebuggingHelperOptionPage::categoryIcon() const +{ + return QIcon(QLatin1String(DEBUGGER_COMMON_SETTINGS_CATEGORY_ICON)); +} + +void DebuggingHelperOptionPage::apply() +{ + m_group.apply(ICore::instance()->settings()); + +/* + if (!m_ui) // page never shown + return; + if (m_ui->gdbChooserWidget->isDirty()) { + //m_abiToDebuggerMap = m_ui->gdbChooserWidget->gdbMapping(); + m_ui->gdbChooserWidget->setGdbMapping(m_abiToDebuggerMap); + gdbMappingChanged = true; + } +*/ +} + +void DebuggingHelperOptionPage::finish() +{ + m_group.finish(); +} + +QWidget *DebuggingHelperOptionPage::createPage(QWidget *parent) +{ + QWidget *w = new QWidget(parent); + m_ui.setupUi(w); + + m_ui.dumperLocationChooser->setExpectedKind(Utils::PathChooser::Command); + m_ui.dumperLocationChooser->setPromptDialogTitle(tr("Choose DebuggingHelper Location")); + m_ui.dumperLocationChooser->setInitialBrowsePathBackup( + ICore::instance()->resourcePath() + "../../lib"); + + m_group.clear(); + m_group.insert(debuggerCore()->action(UseDebuggingHelpers), + m_ui.debuggingHelperGroupBox); + m_group.insert(debuggerCore()->action(UseCustomDebuggingHelperLocation), + m_ui.customLocationGroupBox); + // Suppress Oxygen style's giving flat group boxes bold titles. + if (oxygenStyle()) + m_ui.customLocationGroupBox->setStyleSheet(_("QGroupBox::title { font: ; }")); + + m_group.insert(debuggerCore()->action(CustomDebuggingHelperLocation), + m_ui.dumperLocationChooser); + + m_group.insert(debuggerCore()->action(UseCodeModel), + m_ui.checkBoxUseCodeModel); + m_group.insert(debuggerCore()->action(ShowThreadNames), + m_ui.checkBoxShowThreadNames); + + +#ifndef QT_DEBUG +#if 0 + cmd = am->registerAction(m_dumpLogAction, + DUMP_LOG, globalcontext); + //cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+D,Ctrl+L"))); + cmd->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+F11"))); + mdebug->addAction(cmd); +#endif +#endif + + if (m_searchKeywords.isEmpty()) { + QTextStream(&m_searchKeywords) + << ' ' << m_ui.debuggingHelperGroupBox->title() + << ' ' << m_ui.customLocationGroupBox->title() + << ' ' << m_ui.dumperLocationLabel->text() + << ' ' << m_ui.checkBoxUseCodeModel->text() + << ' ' << m_ui.checkBoxShowThreadNames->text(); + m_searchKeywords.remove(QLatin1Char('&')); + } + return w; +} + +bool DebuggingHelperOptionPage::matches(const QString &s) const +{ + return m_searchKeywords.contains(s, Qt::CaseInsensitive); +} + + +} // namespace Internal +} // namespace Debugger diff --git a/src/plugins/debugger/commonoptionspage.h b/src/plugins/debugger/commonoptionspage.h new file mode 100644 index 00000000000..02e159f85e9 --- /dev/null +++ b/src/plugins/debugger/commonoptionspage.h @@ -0,0 +1,122 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** No Commercial Usage +** +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +**************************************************************************/ + +#ifndef DEBUGGER_COMMONOPTIONSPAGE_H +#define DEBUGGER_COMMONOPTIONSPAGE_H + +#include "ui_commonoptionspage.h" +#include "ui_dumperoptionpage.h" + +#include <coreplugin/dialogs/ioptionspage.h> +#include <projectexplorer/toolchain.h> +#include <utils/savedaction.h> + + +namespace Debugger { +namespace Internal { + +/////////////////////////////////////////////////////////////////////// +// +// CommonOptionsPage +// +/////////////////////////////////////////////////////////////////////// + +class CommonOptionsPage : public Core::IOptionsPage +{ + Q_OBJECT + +public: + CommonOptionsPage(); + + // IOptionsPage + QString id() const; + QString displayName() const; + QString category() const; + QString displayCategory() const; + QIcon categoryIcon() const; + QWidget *createPage(QWidget *parent); + void apply(); + void finish(); + bool matches(const QString &s) const; + + void readSettings(); + void writeSettings(); + QString debuggerForAbi(const QString &abi) const; + +private slots: + void handleToolChainAdditions(ProjectExplorer::ToolChain *); + void handleToolChainRemovals(ProjectExplorer::ToolChain *); + +private: + typedef QMap<QString, QString> AbiToDebuggerMap; + bool m_abiToDebuggerMapChanged; + AbiToDebuggerMap m_abiToDebuggerMap; + Ui::CommonOptionsPage m_ui; + Utils::SavedActionSet m_group; + QString m_searchKeywords; +}; + + +/////////////////////////////////////////////////////////////////////// +// +// DebuggingHelperOptionPage +// +/////////////////////////////////////////////////////////////////////// + +class DebuggingHelperOptionPage : public Core::IOptionsPage +{ +public: + DebuggingHelperOptionPage() {} + + // IOptionsPage + QString id() const; + QString displayName() const; + QString category() const; + QString displayCategory() const; + QIcon categoryIcon() const; + + QWidget *createPage(QWidget *parent); + void apply(); + void finish(); + bool matches(const QString &s) const; + +private: + Ui::DebuggingHelperOptionPage m_ui; + Utils::SavedActionSet m_group; + QString m_searchKeywords; +}; + +} // namespace Internal +} // namespace Debugger + +#endif // DEBUGGER_COMMONOPTIONSPAGE_H diff --git a/src/plugins/debugger/debuggercore.h b/src/plugins/debugger/debuggercore.h index f86d5122c38..caa23bb381e 100644 --- a/src/plugins/debugger/debuggercore.h +++ b/src/plugins/debugger/debuggercore.h @@ -103,7 +103,7 @@ public: virtual bool initialize(const QStringList &arguments, QString *errorMessage) = 0; virtual QWidget *mainWindow() const = 0; virtual bool isDockVisible(const QString &objectName) const = 0; - virtual QString gdbBinaryForAbi(const ProjectExplorer::Abi &abi) const = 0; + virtual QString debuggerForAbi(const ProjectExplorer::Abi &abi) const = 0; virtual void showModuleSymbols(const QString &moduleName, const QVector<Symbol> &symbols) = 0; virtual void openMemoryEditor() = 0; diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index c85528ba931..d02641baf03 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -66,7 +66,6 @@ #include "snapshothandler.h" #include "threadshandler.h" #include "commonoptionspage.h" -#include "gdb/gdboptionspage.h" #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/actionmanager/actioncontainer.h> @@ -594,7 +593,7 @@ public slots: { m_debuggerSettings->writeSettings(); m_mainWindow->writeSettings(); - GdbOptionsPage::writeGdbSettings(); + m_commonOptionsPage->writeSettings(); } void selectThread(int index) @@ -721,7 +720,7 @@ public slots: void runControlStarted(DebuggerEngine *engine); void runControlFinished(DebuggerEngine *engine); DebuggerLanguages activeLanguages() const; - QString gdbBinaryForAbi(const Abi &abi) const; + QString debuggerForAbi(const Abi &abi) const; void remoteCommand(const QStringList &options, const QStringList &); bool isReverseDebugging() const; @@ -1054,6 +1053,7 @@ public: uint m_cmdLineEnabledEngines; QStringList m_arguments; DebuggerToolTipManager *m_toolTipManager; + CommonOptionsPage *m_commonOptionsPage; }; DebuggerPluginPrivate::DebuggerPluginPrivate(DebuggerPlugin *plugin) : @@ -1105,6 +1105,8 @@ DebuggerPluginPrivate::DebuggerPluginPrivate(DebuggerPlugin *plugin) : m_attachCoreAction = 0; m_attachTcfAction = 0; m_detachAction = 0; + + m_commonOptionsPage = 0; } DebuggerPluginPrivate::~DebuggerPluginPrivate() @@ -2359,9 +2361,9 @@ void DebuggerPluginPrivate::remoteCommand(const QStringList &options, runScheduled(); } -QString DebuggerPluginPrivate::gdbBinaryForAbi(const Abi &abi) const +QString DebuggerPluginPrivate::debuggerForAbi(const Abi &abi) const { - return GdbOptionsPage::abiToGdbMap.value(abi.toString()); + return m_commonOptionsPage->debuggerForAbi(abi.toString()); } DebuggerLanguages DebuggerPluginPrivate::activeLanguages() const @@ -2581,8 +2583,11 @@ void DebuggerPluginPrivate::extensionsInitialized() dock = m_mainWindow->createDockWidget(CppLanguage, localsAndWatchers); dock->setProperty(DOCKWIDGET_DEFAULT_AREA, Qt::RightDockWidgetArea); + m_commonOptionsPage = new CommonOptionsPage; + m_plugin->addAutoReleasedObject(m_commonOptionsPage); + m_debuggerSettings->readSettings(); - GdbOptionsPage::readGdbSettings(); + m_commonOptionsPage->readSettings(); // Do not fail to load the whole plugin if something goes wrong here. QString errorMessage; @@ -2833,7 +2838,6 @@ void DebuggerPluginPrivate::extensionsInitialized() cmd->setAttribute(Command::CA_NonConfigurable); // ADD_TO_WATCH1 is enough. } - m_plugin->addAutoReleasedObject(new CommonOptionsPage); QList<Core::IOptionsPage *> engineOptionPages; if (m_cmdLineEnabledEngines & GdbEngineType) addGdbOptionPages(&engineOptionPages); diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 512ffb3534c..b0e278f1842 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -41,7 +41,6 @@ #include "debuggerplugin.h" #include "debuggerstringutils.h" #include "debuggerstartparameters.h" -#include "gdb/gdboptionspage.h" #include "lldb/lldbenginehost.h" #include "debuggertooltipmanager.h" @@ -382,10 +381,10 @@ ConfigurationCheck checkDebugConfiguration(const ProjectExplorer::Abi &abi) if (abi.binaryFormat() == Abi::Format_ELF || abi.binaryFormat() == Abi::Format_Mach_O || (abi.binaryFormat() == Abi::Format_PE && abi.osFlavor() == Abi::Windows_msys)) { - if (debuggerCore()->gdbBinaryForAbi(abi).isEmpty()) { + if (debuggerCore()->debuggerForAbi(abi).isEmpty()) { result.errorMessage = msgNoBinaryForToolChain(abi); result.errorMessage += QLatin1Char(' ') + msgEngineNotAvailable("Gdb"); - result.settingsPage = GdbOptionsPage::settingsId(); + //result.settingsPage = GdbOptionsPage::settingsId(); } } else if (abi.binaryFormat() == Abi::Format_PE && abi.osFlavor() != Abi::Windows_msys) { result = checkCdbConfiguration(abi); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index c9030ece635..c410146dfbd 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -4213,7 +4213,7 @@ bool GdbEngine::startGdb(const QStringList &args, const QString &gdb, const DebuggerStartParameters &sp = startParameters(); m_gdb = QString::fromLocal8Bit(qgetenv("QTC_DEBUGGER_PATH")); if (m_gdb.isEmpty() && sp.startMode != StartRemoteGdb) - m_gdb = debuggerCore()->gdbBinaryForAbi(startParameters().toolChainAbi); + m_gdb = debuggerCore()->debuggerForAbi(startParameters().toolChainAbi); if (m_gdb.isEmpty()) m_gdb = gdb; if (m_gdb.isEmpty()) { diff --git a/src/plugins/debugger/gdb/gdboptionspage.cpp b/src/plugins/debugger/gdb/gdboptionspage.cpp index 8193ec36f6e..49ab398e468 100644 --- a/src/plugins/debugger/gdb/gdboptionspage.cpp +++ b/src/plugins/debugger/gdb/gdboptionspage.cpp @@ -37,163 +37,15 @@ #include <coreplugin/icore.h> #include <projectexplorer/projectexplorer.h> -#include <projectexplorer/toolchainmanager.h> -#include <projectexplorer/abi.h> #include <QtCore/QCoreApplication> #include <QtCore/QDebug> #include <QtCore/QTextStream> -#include <QtCore/QFileInfo> -using namespace ProjectExplorer; namespace Debugger { namespace Internal { -static const char *GDB_MAPPING_ARRAY = "GdbMapping"; -static const char *GDB_ABI_KEY = "Abi"; -static const char *GDB_BINARY_KEY = "Binary"; - -GdbOptionsPage::GdbBinaryToolChainMap GdbOptionsPage::abiToGdbMap; -bool GdbOptionsPage::gdbMappingChanged = true; - -void GdbOptionsPage::readGdbSettings() /* static */ -{ - // FIXME: Convert old settings! - QSettings *settings = Core::ICore::instance()->settings(); - - abiToGdbMap.clear(); - - int size = settings->beginReadArray(GDB_MAPPING_ARRAY); - for (int i = 0; i < size; ++i) { - settings->setArrayIndex(i); - Abi abi(settings->value(GDB_ABI_KEY).toString()); - if (!abi.isValid()) - continue; - QString binary = settings->value(GDB_BINARY_KEY).toString(); - if (binary.isEmpty()) - continue; - abiToGdbMap.insert(abi.toString(), binary); - } - settings->endArray(); - - // Map old settings (pre 2.2): - const QChar separator = QLatin1Char(','); - const QString keyRoot = QLatin1String("GdbBinaries/GdbBinaries"); - for (int i = 1; ; i++) { - const QString value = settings->value(keyRoot + QString::number(i)).toString(); - if (value.isEmpty()) - break; - // Split apart comma-separated binary and its numerical toolchains. - QStringList tokens = value.split(separator); - if (tokens.size() < 2) - break; - - const QString binary = tokens.front(); - // Skip non-existent absolute binaries allowing for upgrades by the installer. - // Force a rewrite of the settings file. - const QFileInfo binaryInfo(binary); - if (binaryInfo.isAbsolute() && !binaryInfo.isExecutable()) { - const QString msg = QString::fromLatin1("Warning: The gdb binary '%1' does not exist, skipping.\n").arg(binary); - qWarning("%s", qPrintable(msg)); - continue; - } - - // Create entries for all toolchains. - tokens.pop_front(); - foreach (const QString &t, tokens) { - // Paranoia: Check if the there is already a binary configured for the toolchain. - QString abi; - switch (t.toInt()) - { - case 0: // GCC - case 1: // Linux ICC -#ifndef Q_OS_WIN - abi = Abi::hostAbi().toString(); -#endif - break; - case 2: // MinGW - case 3: // MSVC - case 4: // WINCE -#ifdef Q_OS_WIN - abi = Abi::hostAbi().toString(); -#endif - break; - case 5: // WINSCW - abi = Abi(Abi::ARM, Abi::Symbian, - Abi::Symbian_emulator, - Abi::Format_ELF, - 32).toString(); - break; - case 6: // GCCE - case 7: // RVCT 2, ARM v5 - case 8: // RVCT 2, ARM v6 - case 11: // RVCT GNUPOC - case 12: // RVCT 4, ARM v5 - case 13: // RVCT 4, ARM v6 - abi = Abi(Abi::ARM, Abi::Symbian, - Abi::Symbian_device, - Abi::Format_ELF, - 32).toString(); - break; - case 9: // GCC Maemo5 - abi = Abi(Abi::ARM, Abi::Linux, - Abi::Linux_maemo, - Abi::Format_ELF, - 32).toString(); - - break; - case 14: // GCC Harmattan - abi = Abi(Abi::ARM, Abi::Linux, - Abi::Linux_harmattan, - Abi::Format_ELF, - 32).toString(); - break; - case 15: // GCC Meego - abi = Abi(Abi::ARM, Abi::Linux, - Abi::Linux_meego, - Abi::Format_ELF, - 32).toString(); - break; - default: - break; - } - if (abi.isEmpty() || abiToGdbMap.contains(abi)) - continue; - - abiToGdbMap.insert(abi, binary); - } - } - - gdbMappingChanged = false; -} - -void GdbOptionsPage::writeGdbSettings() /* static */ -{ - if (!gdbMappingChanged) - return; - - QSettings *settings = Core::ICore::instance()->settings(); - - settings->beginWriteArray(GDB_MAPPING_ARRAY); - - int index = 0; - for (QMap<QString, QString>::const_iterator i = abiToGdbMap.constBegin(); - i != abiToGdbMap.constEnd(); ++i) { - if (i.value().isEmpty()) - continue; - - settings->setArrayIndex(index); - ++index; - - settings->setValue(GDB_ABI_KEY, i.key()); - settings->setValue(GDB_BINARY_KEY, i.value()); - } - settings->endArray(); - - gdbMappingChanged = false; -} - GdbOptionsPage::GdbOptionsPage() : m_ui(0) { } @@ -225,43 +77,13 @@ QIcon GdbOptionsPage::categoryIcon() const QWidget *GdbOptionsPage::createPage(QWidget *parent) { - // Fix up abi mapping now that the ToolChainManager is available: - connect(ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)), - this, SLOT(handleToolChainAdditions(ProjectExplorer::ToolChain*))); - connect(ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)), - this, SLOT(handleToolChainRemovals(ProjectExplorer::ToolChain*))); - - // Update mapping now that toolchains are available - QList<ToolChain *> tcs = - ToolChainManager::instance()->toolChains(); - - QStringList abiList; - foreach (ToolChain *tc, tcs) { - const QString abi = tc->targetAbi().toString(); - if (!abiList.contains(abi)) - abiList.append(abi); - if (!abiToGdbMap.contains(abi)) - handleToolChainAdditions(tc); - } - - QStringList toRemove; - for (QMap<QString, QString>::const_iterator i = abiToGdbMap.constBegin(); - i != abiToGdbMap.constEnd(); ++i) { - if (!abiList.contains(i.key())) - toRemove.append(i.key()); - } - - foreach (const QString &key, toRemove) - abiToGdbMap.remove(key); - - // Actual page setup: QWidget *w = new QWidget(parent); m_ui = new Ui::GdbOptionsPage; m_ui->setupUi(w); - m_ui->gdbChooserWidget->setGdbMapping(abiToGdbMap); m_ui->scriptFileChooser->setExpectedKind(Utils::PathChooser::File); - m_ui->scriptFileChooser->setPromptDialogTitle(tr("Choose Location of Startup Script File")); + m_ui->scriptFileChooser->setPromptDialogTitle( + tr("Choose Location of Startup Script File")); m_group.clear(); m_group.insert(debuggerCore()->action(GdbScriptFile), @@ -315,23 +137,11 @@ QWidget *GdbOptionsPage::createPage(QWidget *parent) void GdbOptionsPage::apply() { - if (!m_ui) // page never shown - return; - m_group.apply(Core::ICore::instance()->settings()); - if (m_ui->gdbChooserWidget->isDirty()) { - abiToGdbMap = m_ui->gdbChooserWidget->gdbMapping(); - m_ui->gdbChooserWidget->setGdbMapping(abiToGdbMap); - gdbMappingChanged = true; - } } void GdbOptionsPage::finish() { - if (!m_ui) // page never shown - return; - delete m_ui; - m_ui = 0; m_group.finish(); } @@ -340,37 +150,5 @@ bool GdbOptionsPage::matches(const QString &s) const return m_searchKeywords.contains(s, Qt::CaseInsensitive); } -void GdbOptionsPage::handleToolChainAdditions(ToolChain *tc) -{ - Abi tcAbi = tc->targetAbi(); - - if (tcAbi.binaryFormat() != Abi::Format_ELF - && tcAbi.binaryFormat() != Abi::Format_Mach_O - && !( tcAbi.os() == Abi::Windows - && tcAbi.osFlavor() == Abi::Windows_msys )) - return; - if (abiToGdbMap.contains(tcAbi.toString())) - return; - - QString binary; -#ifdef Q_OS_UNIX - Abi hostAbi = Abi::hostAbi(); - if (hostAbi == tcAbi) - binary = QLatin1String("gdb"); -#endif - abiToGdbMap.insert(tc->targetAbi().toString(), binary); -} - -void GdbOptionsPage::handleToolChainRemovals(ToolChain *tc) -{ - QList<ToolChain *> tcs = ToolChainManager::instance()->toolChains(); - foreach (ToolChain *current, tcs) { - if (current->targetAbi() == tc->targetAbi()) - return; - } - - abiToGdbMap.remove(tc->targetAbi().toString()); -} - } // namespace Internal } // namespace Debugger diff --git a/src/plugins/debugger/gdb/gdboptionspage.h b/src/plugins/debugger/gdb/gdboptionspage.h index 3a7c9a2c741..91a7845e23c 100644 --- a/src/plugins/debugger/gdb/gdboptionspage.h +++ b/src/plugins/debugger/gdb/gdboptionspage.h @@ -65,16 +65,6 @@ public: static QString settingsId(); - typedef QMap<QString, QString> GdbBinaryToolChainMap; - static GdbBinaryToolChainMap abiToGdbMap; - static bool gdbMappingChanged; - static void readGdbSettings(); - static void writeGdbSettings(); - -private slots: - static void handleToolChainAdditions(ProjectExplorer::ToolChain *); - static void handleToolChainRemovals(ProjectExplorer::ToolChain *); - private: Ui::GdbOptionsPage *m_ui; Utils::SavedActionSet m_group; -- GitLab