diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp index 0320bb5de07..624bb4bf75c 100644 --- a/src/plugins/debugger/breakwindow.cpp +++ b/src/plugins/debugger/breakwindow.cpp @@ -168,13 +168,8 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) BreakByFunctionDialog dlg(this); if (dlg.exec()) emit breakByFunctionRequested(dlg.functionName()); - } else if (act == act8) { -#ifdef Q_OS_WIN - emit breakByFunctionRequested("qMain"); -#else - emit breakByFunctionRequested("main"); -#endif - } + } else if (act == act8) + emit breakByFunctionMainRequested(); } void BreakWindow::deleteBreakpoint(const QModelIndex &idx) diff --git a/src/plugins/debugger/breakwindow.h b/src/plugins/debugger/breakwindow.h index 5bb4e06a0cc..600a86c14d3 100644 --- a/src/plugins/debugger/breakwindow.h +++ b/src/plugins/debugger/breakwindow.h @@ -51,6 +51,7 @@ signals: void breakpointActivated(int index); void breakpointSynchronizationRequested(); void breakByFunctionRequested(const QString &functionName); + void breakByFunctionMainRequested(); private slots: void rowActivated(const QModelIndex &index); diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index 8798bae4801..9cfabc7cfa2 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -389,13 +389,13 @@ void AttachTcfDialog::updateState() m_ui->serverStartScript->setEnabled(enabled); } + /////////////////////////////////////////////////////////////////////// // // StartExternalDialog // /////////////////////////////////////////////////////////////////////// - StartExternalDialog::StartExternalDialog(QWidget *parent) : QDialog(parent), m_ui(new Ui::StartExternalDialog) { @@ -440,6 +440,12 @@ QString StartExternalDialog::executableArguments() const return m_ui->argsEdit->text(); } +bool StartExternalDialog::breakAtMain() const +{ + return m_ui->checkBoxBreakAtMain->isChecked(); +} + + /////////////////////////////////////////////////////////////////////// // diff --git a/src/plugins/debugger/debuggerdialogs.h b/src/plugins/debugger/debuggerdialogs.h index 56f18699b68..bbe5a16d4c0 100644 --- a/src/plugins/debugger/debuggerdialogs.h +++ b/src/plugins/debugger/debuggerdialogs.h @@ -140,6 +140,7 @@ public: QString executableFile() const; QString executableArguments() const; + bool breakAtMain() const; private: Ui::StartExternalDialog *m_ui; diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index ac99281ddbe..bb33bde9088 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -279,6 +279,8 @@ void DebuggerManager::init() this, SIGNAL(setSessionValueRequested(QString,QVariant))); connect(breakView, SIGNAL(breakByFunctionRequested(QString)), this, SLOT(breakByFunction(QString)), Qt::QueuedConnection); + connect(breakView, SIGNAL(breakByFunctionMainRequested()), + this, SLOT(breakByFunctionMain()), Qt::QueuedConnection); // Modules QAbstractItemView *modulesView = @@ -1106,6 +1108,16 @@ void DebuggerManager::setBreakpoint(const QString &fileName, int lineNumber) attemptBreakpointSynchronization(); } +void DebuggerManager::breakByFunctionMain() +{ +#ifdef Q_OS_WIN + // FIXME: wrong on non-Qt based binaries + emit breakByFunction("qMain"); +#else + emit breakByFunction("main"); +#endif +} + void DebuggerManager::breakByFunction(const QString &functionName) { QTC_ASSERT(m_breakHandler, return); diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index c9ff008a762..787f1827edf 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -127,7 +127,8 @@ enum DebuggerStartMode StartRemote // Start and attach to a remote process }; -struct DebuggerStartParameters { +struct DebuggerStartParameters +{ DebuggerStartParameters(); void clear(); @@ -278,6 +279,7 @@ public slots: void runToFunctionExec(); void toggleBreakpoint(); void breakByFunction(const QString &functionName); + void breakByFunctionMain(); void setBreakpoint(const QString &fileName, int lineNumber); void activateFrame(int index); void selectThread(int index); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 18a348f7289..edb1d9986ff 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1202,15 +1202,17 @@ void DebuggerPlugin::startExternalApplication() configValue(_("LastExternalExecutableFile")).toString()); dlg.setExecutableArguments( configValue(_("LastExternalExecutableArguments")).toString()); - if (dlg.exec() != QDialog::Accepted) { + if (dlg.exec() != QDialog::Accepted) return; - } + setConfigValue(_("LastExternalExecutableFile"), dlg.executableFile()); setConfigValue(_("LastExternalExecutableArguments"), dlg.executableArguments()); sp->executable = dlg.executableFile(); sp->processArgs = dlg.executableArguments().split(QLatin1Char(' ')); + if (dlg.breakAtMain()) + m_manager->breakByFunctionMain(); QSharedPointer rc = activeRunConfiguration(); if (RunControl *runControl = m_debuggerRunner diff --git a/src/plugins/debugger/startexternaldialog.ui b/src/plugins/debugger/startexternaldialog.ui index 1b93356584c..ff2aea3608d 100644 --- a/src/plugins/debugger/startexternaldialog.ui +++ b/src/plugins/debugger/startexternaldialog.ui @@ -20,6 +20,19 @@ 9 + + + + Qt::Vertical + + + + 407 + 16 + + + + @@ -48,21 +61,22 @@ + + + + + + + + + + + Break at 'main': + + + - - - - Qt::Vertical - - - - 407 - 16 - - - -