diff options
author | Tim Sander <tim@krieglstein.org> | 2014-06-05 17:22:51 +0200 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2014-06-20 10:57:03 +0200 |
commit | 3828c94b3938ddc60cc431e719a75ec0c8fdbaf7 (patch) | |
tree | 6c146e8d13b3efb3f3140e42594541cd68381978 | |
parent | 5df2389970d574b26380f0aab3de8909ed2f1c7e (diff) | |
download | qt-creator-3828c94b3938ddc60cc431e719a75ec0c8fdbaf7.tar.gz |
GdbDebugger: add fast restart for debugging
Change-Id: Ie51847de912748d05a6b208bec82fd612d777202
Reviewed-by: hjk <hjk121@nokiamail.com>
Reviewed-by: Leena Miettinen <riitta-leena.miettinen@digia.com>
25 files changed, 347 insertions, 251 deletions
diff --git a/src/plugins/baremetal/baremetal.pro b/src/plugins/baremetal/baremetal.pro index e877b934a1..7cf1db563d 100644 --- a/src/plugins/baremetal/baremetal.pro +++ b/src/plugins/baremetal/baremetal.pro @@ -27,7 +27,3 @@ HEADERS += baremetalplugin.h \ baremetaldeviceconfigurationwidget.h \ baremetaldeviceconfigurationwizard.h \ baremetaldeviceconfigurationwizardpages.h - -FORMS += \ - baremetaldeviceconfigurationwizardsetuppage.ui \ - baremetaldeviceconfigurationwidget.ui diff --git a/src/plugins/baremetal/baremetal.qbs b/src/plugins/baremetal/baremetal.qbs index 5571c745f6..72a2f3f71f 100644 --- a/src/plugins/baremetal/baremetal.qbs +++ b/src/plugins/baremetal/baremetal.qbs @@ -21,12 +21,11 @@ QtcPlugin { "baremetaldeviceconfigurationwidget.cpp", "baremetaldeviceconfigurationwidget.h", "baremetaldeviceconfigurationwizard.cpp", "baremetaldeviceconfigurationwizard.h", "baremetaldeviceconfigurationwizardpages.cpp", "baremetaldeviceconfigurationwizardpages.h", - "baremetaldeviceconfigurationwizardsetuppage.ui", "baremetalgdbcommandsdeploystep.cpp", "baremetalgdbcommandsdeploystep.h", "baremetalplugin.cpp", "baremetalplugin.h", "baremetalrunconfiguration.cpp", "baremetalrunconfiguration.h", "baremetalrunconfigurationfactory.cpp", "baremetalrunconfigurationfactory.h", - "baremetalrunconfigurationwidget.cpp", "baremetalrunconfigurationwidget.h", "baremetaldeviceconfigurationwidget.ui", + "baremetalrunconfigurationwidget.cpp", "baremetalrunconfigurationwidget.h", "baremetalruncontrolfactory.cpp", "baremetalruncontrolfactory.h", ] } diff --git a/src/plugins/baremetal/baremetaldevice.cpp b/src/plugins/baremetal/baremetaldevice.cpp index 5913f33a91..8a0ab724d7 100644 --- a/src/plugins/baremetal/baremetaldevice.cpp +++ b/src/plugins/baremetal/baremetaldevice.cpp @@ -38,6 +38,7 @@ using namespace ProjectExplorer; namespace BareMetal { namespace Internal { +const char GdbResetKey[] = "GdbResetCommand"; const char GdbCommandsKey[] = "GdbCommands"; BareMetalDevice::Ptr BareMetalDevice::create() @@ -58,12 +59,14 @@ BareMetalDevice::Ptr BareMetalDevice::create(const BareMetalDevice &other) void BareMetalDevice::fromMap(const QVariantMap &map) { IDevice::fromMap(map); + setGdbResetCommands(map.value(QLatin1String(GdbResetKey)).toString()); setGdbInitCommands(map.value(QLatin1String(GdbCommandsKey)).toString()); } QVariantMap BareMetalDevice::toMap() const { QVariantMap map = IDevice::toMap(); + map.insert(QLatin1String(GdbResetKey), gdbResetCommands()); map.insert(QLatin1String(GdbCommandsKey), gdbInitCommands()); return map; } @@ -114,8 +117,51 @@ BareMetalDevice::BareMetalDevice(const QString &name, Core::Id type, MachineType BareMetalDevice::BareMetalDevice(const BareMetalDevice &other) : IDevice(other) { + setGdbResetCommands(other.gdbResetCommands()); setGdbInitCommands(other.gdbInitCommands()); } +QString BareMetalDevice::exampleString() +{ + return QLatin1String("<p><i>") + + QCoreApplication::translate("BareMetal", "Example:") + + QLatin1String("</i><p>"); +} + +QString BareMetalDevice::hostLineToolTip() +{ + return QLatin1String("<html>") + + QCoreApplication::translate("BareMetal", + "Enter your hostname like \"localhost\" or \"192.0.2.1\" or " + "a command which must support GDB pipelining " + "starting with a pipe symbol.") + + exampleString() + QLatin1String( + " |openocd -c \"gdb_port pipe; " + "log_output openocd.log\" -f boards/myboard.cfg"); +} + +QString BareMetalDevice::resetCommandToolTip() +{ + return QLatin1String("<html>") + + QCoreApplication::translate("BareMetal", + "Enter the hardware reset command here.<br>" + "The CPU should be halted after this command.") + + exampleString() + QLatin1String( + " monitor reset halt"); +} + +QString BareMetalDevice::initCommandToolTip() +{ + return QLatin1String("<html>") + + QCoreApplication::translate("BareMetal", + "Enter commands to reset the board, and write the nonvolatile memory.") + + exampleString() + QLatin1String( + " set remote hardware-breakpoint-limit 6<br/>" + " set remote hardware-watchpoint-limit 4<br/>" + " monitor reset halt<br/>" + " load<br/>" + " monitor reset halt"); +} + } //namespace Internal } //namespace BareMetal diff --git a/src/plugins/baremetal/baremetaldevice.h b/src/plugins/baremetal/baremetaldevice.h index 3da87b64e8..375fcf400a 100644 --- a/src/plugins/baremetal/baremetaldevice.h +++ b/src/plugins/baremetal/baremetaldevice.h @@ -55,12 +55,20 @@ public: ProjectExplorer::DeviceProcessSignalOperation::Ptr signalOperation() const; + QString gdbResetCommands() const { return m_gdbResetCommands; } + void setGdbResetCommands(const QString &gdbResetCommands) { m_gdbResetCommands = gdbResetCommands; } + QString gdbInitCommands() const { return m_gdbInitCommands; } void setGdbInitCommands(const QString &gdbCommands) { m_gdbInitCommands=gdbCommands; } virtual void fromMap(const QVariantMap &map); virtual QVariantMap toMap() const; + static QString exampleString(); + static QString hostLineToolTip(); + static QString initCommandToolTip(); + static QString resetCommandToolTip(); + protected: BareMetalDevice() {} BareMetalDevice(const QString &name, Core::Id type, @@ -69,6 +77,7 @@ protected: private: BareMetalDevice &operator=(const BareMetalDevice &); + QString m_gdbResetCommands; QString m_gdbInitCommands; }; diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp index 34cc50b51e..0431977fbc 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp @@ -29,74 +29,100 @@ #include "baremetaldeviceconfigurationwidget.h" -#include "ui_baremetaldeviceconfigurationwidget.h" #include "baremetaldevice.h" #include <coreplugin/variablechooser.h> #include <ssh/sshconnection.h> #include <utils/qtcassert.h> +#include <QFormLayout> #include <QLabel> +#include <QLineEdit> +#include <QSpinBox> +#include <QPlainTextEdit> +using namespace Core; using namespace QSsh; namespace BareMetal { -using namespace Internal; +namespace Internal { BareMetalDeviceConfigurationWidget::BareMetalDeviceConfigurationWidget( - const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent) : - IDeviceWidget(deviceConfig, parent), - m_ui(new Ui::BareMetalDeviceConfigurationWidget) + const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent) + : IDeviceWidget(deviceConfig, parent) { - m_ui->setupUi(this); - connect(m_ui->gdbHostLineEdit, SIGNAL(editingFinished()), SLOT(hostnameChanged())); - connect(m_ui->gdbPortSpinBox, SIGNAL(valueChanged(int)), SLOT(portChanged())); - connect(m_ui->gdbCommandsTextEdit, SIGNAL(textChanged()), SLOT(gdbInitCommandsChanged())); - Core::VariableChooser::addVariableSupport(m_ui->gdbCommandsTextEdit); - new Core::VariableChooser(this); - initGui(); -} + SshConnectionParameters sshParams = device()->sshParameters(); + QSharedPointer<BareMetalDevice> p = qSharedPointerCast<BareMetalDevice>(device()); + QTC_ASSERT(!p.isNull(), return); -BareMetalDeviceConfigurationWidget::~BareMetalDeviceConfigurationWidget() -{ - delete m_ui; + m_gdbHostLineEdit = new QLineEdit(this); + m_gdbHostLineEdit->setText(sshParams.host); + m_gdbHostLineEdit->setToolTip(BareMetalDevice::hostLineToolTip()); + + m_gdbPortSpinBox = new QSpinBox(this); + m_gdbPortSpinBox->setRange(1, 65535); + m_gdbPortSpinBox->setValue(sshParams.port); + + m_gdbInitCommandsTextEdit = new QPlainTextEdit(this); + m_gdbInitCommandsTextEdit->setPlainText(p->gdbInitCommands()); + m_gdbInitCommandsTextEdit->setToolTip(BareMetalDevice::initCommandToolTip()); + + m_gdbResetCommandsTextEdit = new QPlainTextEdit(this); + m_gdbResetCommandsTextEdit->setPlainText(p->gdbResetCommands()); + m_gdbResetCommandsTextEdit->setToolTip(BareMetalDevice::resetCommandToolTip()); + + QFormLayout *formLayout = new QFormLayout(this); + formLayout->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow); + formLayout->addRow(tr("GDB host:"), m_gdbHostLineEdit); + formLayout->addRow(tr("GDB port:"), m_gdbPortSpinBox); + formLayout->addRow(tr("Init commands:"), m_gdbInitCommandsTextEdit); + formLayout->addRow(tr("Reset commands:"), m_gdbResetCommandsTextEdit); + + VariableChooser::addVariableSupport(m_gdbResetCommandsTextEdit); + VariableChooser::addVariableSupport(m_gdbInitCommandsTextEdit); + (void)new VariableChooser(this); + + connect(m_gdbHostLineEdit, SIGNAL(editingFinished()), SLOT(hostnameChanged())); + connect(m_gdbPortSpinBox, SIGNAL(valueChanged(int)), SLOT(portChanged())); + connect(m_gdbResetCommandsTextEdit, SIGNAL(textChanged()),SLOT(gdbResetCommandsChanged())); + connect(m_gdbInitCommandsTextEdit, SIGNAL(textChanged()), SLOT(gdbInitCommandsChanged())); } void BareMetalDeviceConfigurationWidget::hostnameChanged() { SshConnectionParameters sshParams = device()->sshParameters(); - sshParams.host = m_ui->gdbHostLineEdit->text().trimmed(); + sshParams.host = m_gdbHostLineEdit->text().trimmed(); device()->setSshParameters(sshParams); } void BareMetalDeviceConfigurationWidget::portChanged() { SshConnectionParameters sshParams = device()->sshParameters(); - sshParams.port = m_ui->gdbPortSpinBox->value(); + sshParams.port = m_gdbPortSpinBox->value(); device()->setSshParameters(sshParams); } +void BareMetalDeviceConfigurationWidget::gdbResetCommandsChanged() +{ + QSharedPointer<BareMetalDevice> p = qSharedPointerCast<BareMetalDevice>(device()); + QTC_ASSERT(!p.isNull(), return); + p->setGdbResetCommands(m_gdbResetCommandsTextEdit->toPlainText().trimmed()); +} + void BareMetalDeviceConfigurationWidget::gdbInitCommandsChanged() { QSharedPointer<BareMetalDevice> p = qSharedPointerCast<BareMetalDevice>(device()); QTC_ASSERT(!p.isNull(), return); - p->setGdbInitCommands(m_ui->gdbCommandsTextEdit->toPlainText()); + p->setGdbInitCommands(m_gdbInitCommandsTextEdit->toPlainText()); } -void BareMetalDeviceConfigurationWidget::updateDeviceFromUi() { +void BareMetalDeviceConfigurationWidget::updateDeviceFromUi() +{ hostnameChanged(); portChanged(); + gdbResetCommandsChanged(); gdbInitCommandsChanged(); } -void BareMetalDeviceConfigurationWidget::initGui() -{ - SshConnectionParameters sshParams = device()->sshParameters(); - m_ui->gdbHostLineEdit->setText(sshParams.host); - m_ui->gdbPortSpinBox->setValue(sshParams.port); - QSharedPointer<BareMetalDevice> p = qSharedPointerCast<BareMetalDevice>(device()); - QTC_ASSERT(!p.isNull(), return); - m_ui->gdbCommandsTextEdit->setPlainText(p->gdbInitCommands()); -} - -} //namespace BareMetal +} // namespace Internal +} // namespace BareMetal diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h index 3927a5b397..fb1dc29088 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.h @@ -32,9 +32,14 @@ #include <projectexplorer/devicesupport/idevicewidget.h> -namespace BareMetal { +QT_BEGIN_NAMESPACE +class QLineEdit; +class QSpinBox; +class QPlainTextEdit; +QT_END_NAMESPACE -namespace Ui { class BareMetalDeviceConfigurationWidget; } +namespace BareMetal { +namespace Internal { class BareMetalDeviceConfigurationWidget : public ProjectExplorer::IDeviceWidget @@ -44,19 +49,24 @@ class BareMetalDeviceConfigurationWidget public: explicit BareMetalDeviceConfigurationWidget( const ProjectExplorer::IDevice::Ptr &deviceConfig, QWidget *parent = 0); - ~BareMetalDeviceConfigurationWidget(); private slots: void hostnameChanged(); void portChanged(); + void gdbResetCommandsChanged(); void gdbInitCommandsChanged(); private: void updateDeviceFromUi(); void initGui(); - Ui::BareMetalDeviceConfigurationWidget *m_ui; + + QLineEdit *m_gdbHostLineEdit; + QSpinBox *m_gdbPortSpinBox; + QPlainTextEdit *m_gdbResetCommandsTextEdit; + QPlainTextEdit *m_gdbInitCommandsTextEdit; }; -} //namespace BareMetal +} // namespace Internal +} // namespace BareMetal #endif // BAREMETALDEVICECONFIGURATIONWIDGET_H diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui b/src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui deleted file mode 100644 index 17236089be..0000000000 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui +++ /dev/null @@ -1,82 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>BareMetal::BareMetalDeviceConfigurationWidget</class> - <widget class="QWidget" name="BareMetal::BareMetalDeviceConfigurationWidget"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>496</width> - <height>251</height> - </rect> - </property> - <property name="minimumSize"> - <size> - <width>100</width> - <height>100</height> - </size> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <property name="locale"> - <locale language="English" country="UnitedStates"/> - </property> - <layout class="QFormLayout" name="formLayout"> - <property name="fieldGrowthPolicy"> - <enum>QFormLayout::ExpandingFieldsGrow</enum> - </property> - <item row="0" column="0"> - <widget class="QLabel" name="gdbHostLabel"> - <property name="locale"> - <locale language="English" country="UnitedStates"/> - </property> - <property name="text"> - <string>GDB host:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="gdbHostLineEdit"/> - </item> - <item row="1" column="0"> - <widget class="QLabel" name="gdbPortLabel"> - <property name="locale"> - <locale language="English" country="UnitedStates"/> - </property> - <property name="text"> - <string>GDB port:</string> - </property> - </widget> - </item> - <item row="1" column="1"> - <widget class="QSpinBox" name="gdbPortSpinBox"> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>65535</number> - </property> - <property name="value"> - <number>3333</number> - </property> - </widget> - </item> - <item row="2" column="0"> - <widget class="QLabel" name="gdbCommandsLabel"> - <property name="locale"> - <locale language="English" country="UnitedStates"/> - </property> - <property name="text"> - <string>GDB commands:</string> - </property> - </widget> - </item> - <item row="2" column="1"> - <widget class="QPlainTextEdit" name="gdbCommandsTextEdit"/> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp index d891267e0e..ae15ced0b7 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp @@ -78,6 +78,7 @@ IDevice::Ptr BareMetalDeviceConfigurationWizard::device() const Core::Id(Constants::BareMetalOsType), IDevice::Hardware); device->setSshParameters(sshParams); + device->setGdbResetCommands(d->m_setupPage.gdbResetCommands()); device->setGdbInitCommands(d->m_setupPage.gdbInitCommands()); return device; } diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp index 717a619078..90ef922f83 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp @@ -28,39 +28,73 @@ ****************************************************************************/ #include "baremetaldeviceconfigurationwizardpages.h" -#include "ui_baremetaldeviceconfigurationwizardsetuppage.h" +#include "baremetaldevice.h" #include <coreplugin/variablechooser.h> #include <projectexplorer/devicesupport/idevice.h> +#include <QFormLayout> +#include <QLineEdit> +#include <QPlainTextEdit> +#include <QSpinBox> + +using namespace Core; + namespace BareMetal { namespace Internal { -class BareMetalDeviceConfigurationWizardSetupPagePrivate; -} // namespace Internal -BareMetalDeviceConfigurationWizardSetupPage::BareMetalDeviceConfigurationWizardSetupPage(QWidget *parent) : - QWizardPage(parent), d(new Internal::BareMetalDeviceConfigurationWizardSetupPagePrivate) +BareMetalDeviceConfigurationWizardSetupPage::BareMetalDeviceConfigurationWizardSetupPage(QWidget *parent) + : QWizardPage(parent) { - d->ui.setupUi(this); setTitle(tr("Set up GDB Server or Hardware Debugger")); - setSubTitle(QLatin1String(" ")); // For Qt bug (background color) - connect(d->ui.hostNameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged())); - connect(d->ui.nameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged())); - connect(d->ui.portSpinBox, SIGNAL(valueChanged(int)), SIGNAL(completeChanged())); - connect(d->ui.gdbInitCommandsPlainTextEdit, SIGNAL(textChanged()), SIGNAL(completeChanged())); - Core::VariableChooser::addVariableSupport(d->ui.gdbInitCommandsPlainTextEdit); - new Core::VariableChooser(this); -} -BareMetalDeviceConfigurationWizardSetupPage::~BareMetalDeviceConfigurationWizardSetupPage() -{ - delete d; + m_nameLineEdit = new QLineEdit(this); + + m_hostNameLineEdit = new QLineEdit(this); + m_hostNameLineEdit->setToolTip(BareMetalDevice::hostLineToolTip()); + m_hostNameLineEdit->setText(QLatin1String( + "|openocd -c \"gdb_port pipe\" -c \"log_output openocd.log;\" " + "-f board/stm3241g_eval_stlink.cfg")); + + m_portSpinBox = new QSpinBox(this); + m_portSpinBox->setRange(1, 65535); + m_portSpinBox->setValue(3333); + + m_gdbInitCommandsPlainTextEdit = new QPlainTextEdit(this); + m_gdbInitCommandsPlainTextEdit->setToolTip(BareMetalDevice::initCommandToolTip()); + m_gdbInitCommandsPlainTextEdit->setPlainText(QLatin1String( + "set remote hardware-breakpoint-limit 6\n" + "set remote hardware-watchpoint-limit 4\n" + "monitor reset halt\n" + "load\n" + "monitor reset halt")); + + m_gdbResetCommandsTextEdit = new QPlainTextEdit(this); + m_gdbResetCommandsTextEdit->setToolTip(BareMetalDevice::resetCommandToolTip()); + m_gdbResetCommandsTextEdit->setPlainText(QLatin1String("monitor reset halt")); + + QFormLayout *formLayout = new QFormLayout(this); + formLayout->setFieldGrowthPolicy(QFormLayout::AllNonFixedFieldsGrow); + formLayout->addRow(tr("Name:"), m_nameLineEdit); + formLayout->addRow(tr("GDB host:"), m_hostNameLineEdit); + formLayout->addRow(tr("GDB port:"), m_portSpinBox); + formLayout->addRow(tr("Init commands:"), m_gdbInitCommandsPlainTextEdit); + formLayout->addRow(tr("Reset commands:"), m_gdbResetCommandsTextEdit); + + connect(m_nameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged())); + connect(m_hostNameLineEdit, SIGNAL(textChanged(QString)), SIGNAL(completeChanged())); + connect(m_portSpinBox, SIGNAL(valueChanged(int)), SIGNAL(completeChanged())); + connect(m_gdbResetCommandsTextEdit, SIGNAL(textChanged()), SIGNAL(completeChanged())); + connect(m_gdbInitCommandsPlainTextEdit, SIGNAL(textChanged()), SIGNAL(completeChanged())); + + VariableChooser::addVariableSupport(m_gdbResetCommandsTextEdit); + VariableChooser::addVariableSupport(m_gdbInitCommandsPlainTextEdit); + (void)new VariableChooser(this); } void BareMetalDeviceConfigurationWizardSetupPage::initializePage() { - d->ui.nameLineEdit->setText(defaultConfigurationName()); - + m_nameLineEdit->setText(defaultConfigurationName()); } bool BareMetalDeviceConfigurationWizardSetupPage::isComplete() const @@ -70,22 +104,27 @@ bool BareMetalDeviceConfigurationWizardSetupPage::isComplete() const QString BareMetalDeviceConfigurationWizardSetupPage::configurationName() const { - return d->ui.nameLineEdit->text().trimmed(); + return m_nameLineEdit->text().trimmed(); } QString BareMetalDeviceConfigurationWizardSetupPage::gdbHostname() const { - return d->ui.hostNameLineEdit->text().trimmed(); + return m_hostNameLineEdit->text().trimmed(); } quint16 BareMetalDeviceConfigurationWizardSetupPage::gdbPort() const { - return quint16(d->ui.portSpinBox->value()); + return quint16(m_portSpinBox->value()); +} + +QString BareMetalDeviceConfigurationWizardSetupPage::gdbResetCommands() const +{ + return m_gdbResetCommandsTextEdit->toPlainText().trimmed(); } QString BareMetalDeviceConfigurationWizardSetupPage::gdbInitCommands() const { - return d->ui.gdbInitCommandsPlainTextEdit->toPlainText(); + return m_gdbInitCommandsPlainTextEdit->toPlainText().trimmed(); } QString BareMetalDeviceConfigurationWizardSetupPage::defaultConfigurationName() const @@ -93,4 +132,5 @@ QString BareMetalDeviceConfigurationWizardSetupPage::defaultConfigurationName() return tr("Bare Metal Device"); } +} // namespace Internal } // namespace BareMetal diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h index 1cbb75455e..16096a1494 100644 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h +++ b/src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h @@ -30,40 +30,41 @@ #ifndef BAREMETALDEVICECONFIGURATIONWIZARDPAGES_H #define BAREMETALDEVICECONFIGURATIONWIZARDPAGES_H -#include "ui_baremetaldeviceconfigurationwizardsetuppage.h" #include <QWizardPage> -namespace BareMetal { +QT_BEGIN_NAMESPACE +class QLineEdit; +class QSpinBox; +class QPlainTextEdit; +QT_END_NAMESPACE +namespace BareMetal { namespace Internal { -class BareMetalDeviceConfigurationWizardSetupPagePrivate -{ -public: - Ui::BareMetalDeviceConfigurationWizardSetupPage ui; -}; - -} // namespace Internal - class BareMetalDeviceConfigurationWizardSetupPage : public QWizardPage { - Q_OBJECT public: explicit BareMetalDeviceConfigurationWizardSetupPage(QWidget *parent = 0); - ~BareMetalDeviceConfigurationWizardSetupPage(); void initializePage(); bool isComplete() const; QString configurationName() const; QString gdbHostname() const; quint16 gdbPort() const; + QString gdbResetCommands() const; QString gdbInitCommands() const; virtual QString defaultConfigurationName() const; + private: - Internal::BareMetalDeviceConfigurationWizardSetupPagePrivate * const d; + QLineEdit *m_nameLineEdit; + QLineEdit *m_hostNameLineEdit; + QSpinBox *m_portSpinBox; + QPlainTextEdit *m_gdbResetCommandsTextEdit; + QPlainTextEdit *m_gdbInitCommandsPlainTextEdit; }; +} // namespace Internal } // namespace BareMetal #endif // BAREMETALDEVICECONFIGURATIONWIZARDPAGES_H diff --git a/src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui b/src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui deleted file mode 100644 index be6c1dd120..0000000000 --- a/src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui +++ /dev/null @@ -1,86 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>BareMetal::Internal::BareMetalDeviceConfigurationWizardSetupPage</class> - <widget class="QWidget" name="BareMetal::Internal::BareMetalDeviceConfigurationWizardSetupPage"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>517</width> - <height>301</height> - </rect> - </property> - <property name="windowTitle"> - <string>Form</string> - </property> - <property name="locale"> - <locale language="English" country="UnitedStates"/> - </property> - <layout class="QFormLayout" name="formLayout"> - <item row="0" column="0"> - <widget class="QLabel" name="namelabel"> - <property name="text"> - <string>Name:</string> - </property> - </widget> - </item> - <item row="0" column="1"> - <widget class="QLineEdit" name="nameLineEdit"/> - </item> - <item row="3" column="1"> - <widget class="QLineEdit" name="hostNameLineEdit"> - <property name="text"> - <string>|openocd -c "gdb_port pipe" -c "log_output openocd.log;" -f board/stm3241g_eval_stlink.cfg</string> - </property> - </widget> - </item> - <item row="6" column="0"> - <widget class="QLabel" name="HostPortLabel"> - <property name="text"> - <string>GDB port:</string> - </property> - </widget> - </item> - <item row="3" column="0"> - <widget class="QLabel" name="hostLabel"> - <property name="text"> - <string>GDB host:</string> - </property> - </widget> - </item> - <item row="6" column="1"> - <widget class="QSpinBox" name="portSpinBox"> - <property name="minimum"> - <number>1</number> - </property> - <property name="maximum"> - <number>65535</number> - </property> - <property name="value"> - <number>3333</number> - </property> - </widget> - </item> - <item row="7" column="0"> - <widget class="QLabel" name="gdbInitLabel"> - <property name="text"> - <string>GDB commands:</string> - </property> - </widget> - </item> - <item row="7" column="1"> - <widget class="QPlainTextEdit" name="gdbInitCommandsPlainTextEdit"> - <property name="plainText"> - <string>set remote hardware-breakpoint-limit 6 -set remote hardware-watchpoint-limit 4 -monitor reset halt -load -monitor reset halt</string> - </property> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections/> -</ui> diff --git a/src/plugins/baremetal/baremetalruncontrolfactory.cpp b/src/plugins/baremetal/baremetalruncontrolfactory.cpp index 04cd5b0b78..b79cfb91f7 100644 --- a/src/plugins/baremetal/baremetalruncontrolfactory.cpp +++ b/src/plugins/baremetal/baremetalruncontrolfactory.cpp @@ -33,7 +33,6 @@ #include "baremetaldevice.h" #include <debugger/debuggerplugin.h> -#include <debugger/debuggerrunner.h> #include <debugger/debuggerstartparameters.h> #include <debugger/debuggerkitinformation.h> #include <projectexplorer/buildsteplist.h> @@ -104,6 +103,7 @@ DebuggerStartParameters BareMetalRunControlFactory::startParameters(const BareMe params.remoteChannel = device->sshParameters().host + QLatin1String(":") + QString::number(device->sshParameters().port); params.remoteSetupNeeded = false; // qml stuff, not needed params.commandsAfterConnect = device->gdbInitCommands().toLatin1(); + params.commandsForReset = device->gdbResetCommands().toLatin1(); BuildConfiguration *bc = target->activeBuildConfiguration(); BuildStepList *bsl = bc->stepList(BareMetalGdbCommandsDeployStep::stepId()); if (bsl) { diff --git a/src/plugins/baremetal/baremetalruncontrolfactory.h b/src/plugins/baremetal/baremetalruncontrolfactory.h index 2b349c687e..b0b6f2dcef 100644 --- a/src/plugins/baremetal/baremetalruncontrolfactory.h +++ b/src/plugins/baremetal/baremetalruncontrolfactory.h @@ -34,6 +34,7 @@ #include <projectexplorer/runconfiguration.h> #include <debugger/debuggerstartparameters.h> +#include <debugger/debuggerrunner.h> namespace BareMetal { namespace Internal { diff --git a/src/plugins/debugger/debugger.qrc b/src/plugins/debugger/debugger.qrc index 06ac7d09d1..5fe047141b 100644 --- a/src/plugins/debugger/debugger.qrc +++ b/src/plugins/debugger/debugger.qrc @@ -36,5 +36,7 @@ <file>images/qml/select.png</file> <file>images/qml/app-on-top.png</file> <file>images/qml/apply-on-save.png</file> + <file>images/debugger_restart.png</file> + <file>images/debugger_restart_small.png</file> </qresource> </RCC> diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index 02517dc65c..838cb7464a 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -58,6 +58,7 @@ const char STEP[] = "Debugger.StepLine"; const char STEPOUT[] = "Debugger.StepOut"; const char NEXT[] = "Debugger.NextLine"; const char REVERSE[] = "Debugger.ReverseDirection"; +const char RESET[] = "Debugger.Reset"; const char OPERATE_BY_INSTRUCTION[] = "Debugger.OperateByInstruction"; const char QML_SHOW_APP_ON_TOP[] = "Debugger.QmlShowAppOnTop"; const char QML_UPDATE_ON_SAVE[] = "Debugger.QmlUpdateOnSave"; @@ -162,7 +163,8 @@ enum DebuggerCapabilities MemoryAddressCapability = 0x1000000, ShowModuleSectionsCapability = 0x200000, WatchComplexExpressionsCapability = 0x400000, // Used to filter out challenges for cdb. - AdditionalQmlStackCapability = 0x800000 // C++ debugger engine is able to retrieve QML stack as well. + AdditionalQmlStackCapability = 0x800000, // C++ debugger engine is able to retrieve QML stack as well. + ResetInferiorCapability = 0x1000000 //!< restart program while debugging }; enum LogChannel diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h index e1c4163884..453c755f4b 100644 --- a/src/plugins/debugger/debuggerengine.h +++ b/src/plugins/debugger/debuggerengine.h @@ -334,6 +334,7 @@ protected: virtual void runEngine() = 0; virtual void shutdownInferior() = 0; virtual void shutdownEngine() = 0; + virtual void resetInferior() {} virtual void detachDebugger(); virtual void exitDebugger(); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 89b2de50ae..303a1af21e 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1004,6 +1004,12 @@ public slots: currentEngine()->abortDebugger(); } + void handleReset() + { + currentEngine()->resetLocation(); + currentEngine()->resetInferior(); + } + void handleExecStep() { if (currentEngine()->state() == DebuggerNotReady) { @@ -1250,6 +1256,7 @@ public: QAction *m_reverseDirectionAction; QAction *m_frameUpAction; QAction *m_frameDownAction; + QAction *m_resetAction; QToolButton *m_reverseToolButton; @@ -1258,6 +1265,7 @@ public: QIcon m_continueIcon; QIcon m_interruptIcon; QIcon m_locationMarkIcon; + QIcon m_resetIcon; StatusLabel *m_statusLabel; QComboBox *m_threadBox; @@ -2247,6 +2255,7 @@ void DebuggerPluginPrivate::setInitialState() m_exitAction->setEnabled(false); m_abortAction->setEnabled(false); + m_resetAction->setEnabled(false); m_interruptAction->setEnabled(false); m_continueAction->setEnabled(false); @@ -2386,6 +2395,8 @@ void DebuggerPluginPrivate::updateState(DebuggerEngine *engine) m_abortAction->setEnabled(state != DebuggerNotReady && state != DebuggerFinished); + m_resetAction->setEnabled((stopped || state == DebuggerNotReady) + && engine->hasCapability(ResetInferiorCapability)); m_stepAction->setEnabled(stopped || state == DebuggerNotReady); m_nextAction->setEnabled(stopped || state == DebuggerNotReady); @@ -2775,6 +2786,8 @@ void DebuggerPluginPrivate::extensionsInitialized() m_interruptIcon = QIcon(_(Core::Constants::ICON_PAUSE)); m_interruptIcon.addFile(QLatin1String(":/debugger/images/debugger_interrupt.png")); m_locationMarkIcon = QIcon(_(":/debugger/images/location_16.png")); + m_resetIcon = QIcon(_(":/debugger/images/debugger_restart_small.png:")); + m_resetIcon.addFile(QLatin1String(":/debugger/images/debugger_restart.png")); m_busy = false; @@ -2849,6 +2862,11 @@ void DebuggerPluginPrivate::extensionsInitialized() "resets the debugger to the initial state.")); connect(act, SIGNAL(triggered()), SLOT(handleAbort())); + act = m_resetAction = new QAction(tr("Restart Debugging"),this); + act->setToolTip(tr("Restart the debugging session.")); + act->setIcon(m_resetIcon); + connect(act,SIGNAL(triggered()),SLOT(handleReset())); + act = m_nextAction = new QAction(tr("Step Over"), this); act->setIcon(QIcon(QLatin1String(":/debugger/images/debugger_stepover_small.png"))); connect(act, SIGNAL(triggered()), SLOT(handleExecNext())); @@ -3098,6 +3116,12 @@ void DebuggerPluginPrivate::extensionsInitialized() cmd->setDescription(tr("Reset Debugger")); debugMenu->addAction(cmd, CC::G_DEFAULT_ONE); + cmd = ActionManager::registerAction(m_resetAction, + Constants::RESET, globalcontext); + cmd->setDescription(tr("Restart Debugging")); + cmd->setDefaultKeySequence(QKeySequence(tr("Shift+Ctrl+R"))); + debugMenu->addAction(cmd, CC::G_DEFAULT_ONE); + debugMenu->addSeparator(globalcontext); cmd = ActionManager::registerAction(m_nextAction, @@ -3310,6 +3334,7 @@ void DebuggerPluginPrivate::extensionsInitialized() hbox->addWidget(toolButton(Constants::NEXT)); hbox->addWidget(toolButton(Constants::STEP)); hbox->addWidget(toolButton(Constants::STEPOUT)); + hbox->addWidget(toolButton(Constants::RESET)); hbox->addWidget(toolButton(Constants::OPERATE_BY_INSTRUCTION)); //hbox->addWidget(new StyledSeparator); diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h index 17dc02a7b6..4f8ffe7d07 100644 --- a/src/plugins/debugger/debuggerstartparameters.h +++ b/src/plugins/debugger/debuggerstartparameters.h @@ -131,6 +131,7 @@ public: QMap<QString, QString> sourcePathMap; // Used by baremetal plugin + QByteArray commandsForReset; // commands used for resetting the inferior bool useContinueInsteadOfRun; // if connected to a hw debugger run is not possible but continue is used QByteArray commandsAfterConnect; // additional commands to post after connection to debug target diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 41bc6c05b5..02c142415a 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1213,7 +1213,8 @@ void GdbEngine::handleResultRecord(GdbResponse *response) showMessage(_("ALL COMMANDS DONE; INVOKING CALLBACK")); CommandsDoneCallback cont = m_commandsDoneCallback; m_commandsDoneCallback = 0; - (this->*cont)(); + if (response->resultClass != GdbResultRunning) //only start if the thing is not already running + (this->*cont)(); } else { PENDING_DEBUG("MISSING TOKENS: " << m_cookieForToken.keys()); } @@ -2028,7 +2029,8 @@ bool GdbEngine::hasCapability(unsigned cap) const | RunToLineCapability | WatchComplexExpressionsCapability | MemoryAddressCapability - | AdditionalQmlStackCapability)) + | AdditionalQmlStackCapability + | ResetInferiorCapability)) return true; if (startParameters().startMode == AttachCore) @@ -4430,6 +4432,29 @@ void GdbEngine::abortDebugger() } } +void GdbEngine::resetInferior() +{ + if (!startParameters().commandsForReset.isEmpty()) { + QByteArray substitutedCommands = VariableManager::expandedString( + QString::fromLatin1(startParameters().commandsForReset)).toLatin1(); + foreach (QByteArray command, substitutedCommands.split('\n')) { + command = command.trimmed(); + if (!command.isEmpty()) { + if (state() == InferiorStopOk) { + postCommand(command, ConsoleCommand|Immediate); + } else { + GdbCommand gdbCmd; + gdbCmd.command = command; + gdbCmd.flags = ConsoleCommand; + m_commandsToRunOnTemporaryBreak.append(gdbCmd); + } + } + } + } + requestInterruptInferior(); + runEngine(); +} + void GdbEngine::handleAdapterStartFailed(const QString &msg, Id settingsIdHint) { QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state()); diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 28a793869b..215338b25d 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -78,6 +78,7 @@ private: ////////// General Interface ////////// virtual void shutdownInferior(); virtual void shutdownEngine() = 0; virtual void abortDebugger(); + virtual void resetInferior(); virtual bool acceptsDebuggerCommands() const; virtual void executeDebuggerCommand(const QString &command, DebuggerLanguages languages); diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp index 4d2098fc9d..ca6e95771d 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp @@ -406,7 +406,7 @@ void GdbRemoteServerEngine::runEngine() { QTC_ASSERT(state() == EngineRunRequested, qDebug() << state()); - const QString remoteExecutable = startParameters().remoteExecutable; // This is only set for pure QNX + const QString remoteExecutable = startParameters().remoteExecutable; if (!remoteExecutable.isEmpty()) { postCommand("-exec-run", GdbEngine::RunRequest, CB(handleExecRun)); } else { diff --git a/src/plugins/debugger/images/debugger_restart.png b/src/plugins/debugger/images/debugger_restart.png Binary files differnew file mode 100644 index 0000000000..2c64931207 --- /dev/null +++ b/src/plugins/debugger/images/debugger_restart.png diff --git a/src/plugins/debugger/images/debugger_restart.svg b/src/plugins/debugger/images/debugger_restart.svg new file mode 100644 index 0000000000..08af9db3e3 --- /dev/null +++ b/src/plugins/debugger/images/debugger_restart.svg @@ -0,0 +1,77 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> + +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + id="svg2403" + height="16" + width="16" + version="1.0" + inkscape:version="0.48.4 r9939" + sodipodi:docname="restartF.svg" + inkscape:export-filename="/home/tstone/projekte/stm32/qt-creator/src/plugins/debugger/images/restart.png" + inkscape:export-xdpi="90" + inkscape:export-ydpi="90"> + <metadata + id="metadata9"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:title></dc:title> + </cc:Work> + </rdf:RDF> + </metadata> + <defs + id="defs7" /> + <sodipodi:namedview + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1" + objecttolerance="10" + gridtolerance="10" + guidetolerance="10" + inkscape:pageopacity="0" + inkscape:pageshadow="2" + inkscape:window-width="812" + inkscape:window-height="480" + id="namedview5" + showgrid="false" + inkscape:zoom="2.6074563" + inkscape:cx="29.713525" + inkscape:cy="39.686584" + inkscape:window-x="528" + inkscape:window-y="112" + inkscape:window-maximized="0" + inkscape:current-layer="svg2403" /> + <path + id="circle" + style="fill:none;stroke:#39a200;stroke-width:3;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 4.3814407,4.7280695 C 1.0195763,7.1548695 2.1753174,13.61748 7.4891237,13.770186 12.207451,13.905779 15.5821,9.9571474 11.885043,4.5928762" + inkscape:connector-curvature="0" + sodipodi:nodetypes="csc" /> + <path + id="topmark" + style="stroke:#39a200;stroke-linecap:round;stroke-width:3;fill:none;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" + d="m8 6.9952v-4.9904" /> + <path + style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1" + d="M 4.677966,4.5423729 C 0.38168193,7.6562328 2.6923842,13.541247 7.5932203,13.627119" + id="arrow" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cc" /> + <path + style="fill:#ffffff;fill-opacity:0.94117647;stroke:#39a200;stroke-width:0;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + d="M 7.8291211,15.145082 11.463143,13.540112 7.7592641,12.467117 z" + id="arrowhead" + inkscape:connector-curvature="0" + sodipodi:nodetypes="cccc" /> +</svg> diff --git a/src/plugins/debugger/images/debugger_restart_small.png b/src/plugins/debugger/images/debugger_restart_small.png Binary files differnew file mode 100644 index 0000000000..6b10c8fe79 --- /dev/null +++ b/src/plugins/debugger/images/debugger_restart_small.png diff --git a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp index db9b15f45d..11a5f0df52 100644 --- a/src/plugins/remotelinux/remotelinuxdebugsupport.cpp +++ b/src/plugins/remotelinux/remotelinuxdebugsupport.cpp @@ -104,6 +104,7 @@ DebuggerStartParameters LinuxDeviceDebugSupport::startParameters(const AbstractR params.startMode = AttachToRemoteServer; params.executable = runConfig->localExecutableFilePath(); params.remoteChannel = device->sshParameters().host + QLatin1String(":-1"); + params.remoteExecutable = runConfig->remoteExecutableFilePath(); } else { params.startMode = AttachToRemoteServer; } |