summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Sander <tim@krieglstein.org>2014-06-05 17:22:51 +0200
committerhjk <hjk121@nokiamail.com>2014-06-20 10:57:03 +0200
commit3828c94b3938ddc60cc431e719a75ec0c8fdbaf7 (patch)
tree6c146e8d13b3efb3f3140e42594541cd68381978
parent5df2389970d574b26380f0aab3de8909ed2f1c7e (diff)
downloadqt-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>
-rw-r--r--src/plugins/baremetal/baremetal.pro4
-rw-r--r--src/plugins/baremetal/baremetal.qbs3
-rw-r--r--src/plugins/baremetal/baremetaldevice.cpp46
-rw-r--r--src/plugins/baremetal/baremetaldevice.h9
-rw-r--r--src/plugins/baremetal/baremetaldeviceconfigurationwidget.cpp88
-rw-r--r--src/plugins/baremetal/baremetaldeviceconfigurationwidget.h20
-rw-r--r--src/plugins/baremetal/baremetaldeviceconfigurationwidget.ui82
-rw-r--r--src/plugins/baremetal/baremetaldeviceconfigurationwizard.cpp1
-rw-r--r--src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.cpp86
-rw-r--r--src/plugins/baremetal/baremetaldeviceconfigurationwizardpages.h27
-rw-r--r--src/plugins/baremetal/baremetaldeviceconfigurationwizardsetuppage.ui86
-rw-r--r--src/plugins/baremetal/baremetalruncontrolfactory.cpp2
-rw-r--r--src/plugins/baremetal/baremetalruncontrolfactory.h1
-rw-r--r--src/plugins/debugger/debugger.qrc2
-rw-r--r--src/plugins/debugger/debuggerconstants.h4
-rw-r--r--src/plugins/debugger/debuggerengine.h1
-rw-r--r--src/plugins/debugger/debuggerplugin.cpp25
-rw-r--r--src/plugins/debugger/debuggerstartparameters.h1
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp29
-rw-r--r--src/plugins/debugger/gdb/gdbengine.h1
-rw-r--r--src/plugins/debugger/gdb/remotegdbserveradapter.cpp2
-rw-r--r--src/plugins/debugger/images/debugger_restart.pngbin0 -> 1035 bytes
-rw-r--r--src/plugins/debugger/images/debugger_restart.svg77
-rw-r--r--src/plugins/debugger/images/debugger_restart_small.pngbin0 -> 675 bytes
-rw-r--r--src/plugins/remotelinux/remotelinuxdebugsupport.cpp1
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(
+ "&nbsp;&nbsp;|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(
+ "&nbsp;&nbsp;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(
+ "&nbsp;&nbsp;set remote hardware-breakpoint-limit 6<br/>"
+ "&nbsp;&nbsp;set remote hardware-watchpoint-limit 4<br/>"
+ "&nbsp;&nbsp;monitor reset halt<br/>"
+ "&nbsp;&nbsp;load<br/>"
+ "&nbsp;&nbsp;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 &quot;gdb_port pipe&quot; -c &quot;log_output openocd.log;&quot; -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
new file mode 100644
index 0000000000..2c64931207
--- /dev/null
+++ b/src/plugins/debugger/images/debugger_restart.png
Binary files differ
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
new file mode 100644
index 0000000000..6b10c8fe79
--- /dev/null
+++ b/src/plugins/debugger/images/debugger_restart_small.png
Binary files differ
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;
}