diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index f44cff77d01f21dbab4bd5762bd5c7904835cfe6..495b116e40426c60a91ac1cf9a868cf80d842919 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -200,10 +200,10 @@ Q_DECLARE_METATYPE(Debugger::Internal::ConditionalBreakPointCookie) namespace Debugger { namespace Internal { -static inline bool isConsole(const DebuggerStartParameters &sp) +static inline bool isCreatorConsole(const DebuggerStartParameters &sp, const CdbOptions &o) { - return (sp.startMode == StartInternal || sp.startMode == StartExternal) - && sp.useTerminal; + return !o.cdbConsole && sp.useTerminal + && (sp.startMode == StartInternal || sp.startMode == StartExternal); } static QMessageBox * @@ -651,6 +651,7 @@ void CdbEngine::consoleStubProcessStarted() attachParameters.processArgs.clear(); attachParameters.attachPID = m_consoleStub->applicationPID(); attachParameters.startMode = AttachExternal; + attachParameters.useTerminal = false; showMessage(QString::fromLatin1("Attaching to %1...").arg(attachParameters.attachPID), LogMisc); QString errorMessage; if (!launchCDB(attachParameters, &errorMessage)) { @@ -682,7 +683,7 @@ void CdbEngine::setupEngine() // console, too, but that immediately closes when the debuggee quits. // Use the Creator stub instead. const DebuggerStartParameters &sp = startParameters(); - const bool launchConsole = isConsole(sp); + const bool launchConsole = isCreatorConsole(sp, *m_options); m_effectiveStartMode = launchConsole ? AttachExternal : sp.startMode; const bool ok = launchConsole ? startConsole(startParameters(), &errorMessage) : @@ -829,7 +830,7 @@ void CdbEngine::runEngine() if (debug) qDebug("runEngine"); // Resume the threads frozen by the console stub. - if (isConsole(startParameters())) + if (isCreatorConsole(startParameters(), *m_options)) postCommand("~* m", 0); foreach (const QString &breakEvent, m_options->breakEvents) postCommand(QByteArray("sxe ") + breakEvent.toAscii(), 0); diff --git a/src/plugins/debugger/cdb/cdboptions.cpp b/src/plugins/debugger/cdb/cdboptions.cpp index 14042eaa3dcb572d6b3588e5595bf6ebdd419a7f..f4e22273b786667327b9c20645b6ff96b1dfaea2 100644 --- a/src/plugins/debugger/cdb/cdboptions.cpp +++ b/src/plugins/debugger/cdb/cdboptions.cpp @@ -39,11 +39,12 @@ static const char symbolPathsKeyC[] = "SymbolPaths"; static const char sourcePathsKeyC[] = "SourcePaths"; static const char breakEventKeyC[] = "BreakEvent"; static const char additionalArgumentsKeyC[] = "AdditionalArguments"; +static const char cdbConsoleKeyC[] = "CDB_Console"; namespace Debugger { namespace Internal { -CdbOptions::CdbOptions() +CdbOptions::CdbOptions() : cdbConsole(false) { } @@ -56,6 +57,7 @@ void CdbOptions::clear() { symbolPaths.clear(); sourcePaths.clear(); + cdbConsole = false; } QStringList CdbOptions::oldEngineSymbolPaths(const QSettings *s) @@ -71,6 +73,7 @@ void CdbOptions::fromSettings(QSettings *s) symbolPaths = s->value(keyRoot + QLatin1String(symbolPathsKeyC), QStringList()).toStringList(); sourcePaths = s->value(keyRoot + QLatin1String(sourcePathsKeyC), QStringList()).toStringList(); breakEvents = s->value(keyRoot + QLatin1String(breakEventKeyC), QStringList()).toStringList(); + cdbConsole = s->value(keyRoot + QLatin1String(cdbConsoleKeyC), QVariant(false)).toBool(); } void CdbOptions::toSettings(QSettings *s) const @@ -80,12 +83,14 @@ void CdbOptions::toSettings(QSettings *s) const s->setValue(QLatin1String(sourcePathsKeyC), sourcePaths); s->setValue(QLatin1String(breakEventKeyC), breakEvents); s->setValue(QLatin1String(additionalArgumentsKeyC), additionalArguments); + s->setValue(QLatin1String(cdbConsoleKeyC), QVariant(cdbConsole)); s->endGroup(); } bool CdbOptions::equals(const CdbOptions &rhs) const { - return additionalArguments == rhs.additionalArguments + return cdbConsole == rhs.cdbConsole + && additionalArguments == rhs.additionalArguments && symbolPaths == rhs.symbolPaths && sourcePaths == rhs.sourcePaths && breakEvents == rhs.breakEvents; diff --git a/src/plugins/debugger/cdb/cdboptions.h b/src/plugins/debugger/cdb/cdboptions.h index cc85b438938ce9733dca8a31be44fd5ef6d31c17..e26a48caadccea91d93d9443d1eb3310c95f7cab 100644 --- a/src/plugins/debugger/cdb/cdboptions.h +++ b/src/plugins/debugger/cdb/cdboptions.h @@ -64,6 +64,7 @@ public: QStringList sourcePaths; // Events to break on (Command 'sxe' with abbreviation and optional parameter) QStringList breakEvents; + bool cdbConsole; }; inline bool operator==(const CdbOptions &s1, const CdbOptions &s2) diff --git a/src/plugins/debugger/cdb/cdboptionspage.cpp b/src/plugins/debugger/cdb/cdboptionspage.cpp index ccc75896c5b786b230bb2ca634dfc300324306f5..e5f06f03b97fb8ff067fc744bda7e90a5eecf999 100644 --- a/src/plugins/debugger/cdb/cdboptionspage.cpp +++ b/src/plugins/debugger/cdb/cdboptionspage.cpp @@ -174,6 +174,7 @@ void CdbOptionsPageWidget::setOptions(CdbOptions &o) setSymbolPaths(o.symbolPaths); m_ui.sourcePathListEditor->setPathList(o.sourcePaths); m_breakEventWidget->setBreakEvents(o.breakEvents); + m_ui.consoleCheckBox->setChecked(o.cdbConsole); } CdbOptions CdbOptionsPageWidget::options() const @@ -183,6 +184,7 @@ CdbOptions CdbOptionsPageWidget::options() const rc.symbolPaths = symbolPaths(); rc.sourcePaths = m_ui.sourcePathListEditor->pathList(); rc.breakEvents = m_breakEventWidget->breakEvents(); + rc.cdbConsole = m_ui.consoleCheckBox->isChecked(); return rc; } diff --git a/src/plugins/debugger/cdb/cdboptionspagewidget.ui b/src/plugins/debugger/cdb/cdboptionspagewidget.ui index c3a29266ee75cc62c693b662d9a27adfc1c4f3e6..94f6fc12c85c0c4d124f562aaf6aa895d301fed0 100644 --- a/src/plugins/debugger/cdb/cdboptionspagewidget.ui +++ b/src/plugins/debugger/cdb/cdboptionspagewidget.ui @@ -6,8 +6,8 @@ <rect> <x>0</x> <y>0</y> - <width>318</width> - <height>298</height> + <width>334</width> + <height>317</height> </rect> </property> <layout class="QVBoxLayout" name="verticalLayout"> @@ -41,6 +41,16 @@ <item row="0" column="1"> <widget class="QLineEdit" name="additionalArgumentsLineEdit"/> </item> + <item row="1" column="0" colspan="2"> + <widget class="QCheckBox" name="consoleCheckBox"> + <property name="toolTip"> + <string><html><head/><body><p>Use CDB's native console instead of Qt Creator's console for console applications. The native console does not prompt on application exit. It is suitable for diagnosing cases in which the application does not start up properly in Qt Creator's console and the subsequent attach fails.</p></body></html></string> + </property> + <property name="text"> + <string>Use CDB &console</string> + </property> + </widget> + </item> </layout> </widget> </item>