diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index 1367cbeb5bd5da4305f9959dfcc5f2a35cb97338..5925f2df179ac9254e3921942e0fc3e6cf9645e8 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -134,6 +134,12 @@ enum DebuggerStartMode StartRemoteEngine // Start ipc guest engine on other machine }; +enum DebuggerCloseMode +{ + KillAtClose, + DetachAtClose +}; + enum DebuggerCapabilities { ReverseSteppingCapability = 0x1, diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 0eb329b346eb8f5f53e2b5b53d86eac19e0d6865..45e1e3e8243115904d5add13ff125bdc3bc58d90 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1339,6 +1339,7 @@ bool DebuggerPluginPrivate::parseArgument(QStringList::const_iterator &it, qulonglong pid = it->toULongLong(); if (pid) { sp.startMode = AttachExternal; + sp.closeMode = DetachAtClose; sp.attachPID = pid; sp.displayName = tr("Process %1").arg(sp.attachPID); sp.startMessage = tr("Attaching to local process %1.").arg(sp.attachPID); @@ -1560,6 +1561,7 @@ void DebuggerPluginPrivate::attachExternalApplication() sp.displayName = tr("Process %1").arg(dlg.attachPID()); sp.executable = dlg.executable(); sp.startMode = AttachExternal; + sp.closeMode = DetachAtClose; sp.toolChainAbi = dlg.abi(); sp.debuggerCommand = dlg.debuggerCommand(); if (DebuggerRunControl *rc = createDebugger(sp)) @@ -1572,6 +1574,7 @@ void DebuggerPluginPrivate::attachExternalApplication(RunControl *rc) sp.attachPID = rc->applicationProcessHandle().pid(); sp.displayName = tr("Debugger attached to %1").arg(rc->displayName()); sp.startMode = AttachExternal; + sp.closeMode = DetachAtClose; sp.toolChainAbi = rc->abi(); if (DebuggerRunControl *rc = createDebugger(sp)) startDebugger(rc); @@ -1617,6 +1620,7 @@ void DebuggerPluginPrivate::attachToRemoteServer(const QString &spec) sp.remoteArchitecture = spec.section(QLatin1Char('@'), 2, 2); sp.displayName = tr("Remote: \"%1\"").arg(sp.remoteChannel); sp.startMode = AttachToRemoteServer; + sp.closeMode = KillAtClose; sp.toolChainAbi = anyAbiOfBinary(sp.executable); if (DebuggerRunControl *rc = createDebugger(sp)) startDebugger(rc); @@ -1630,6 +1634,7 @@ void DebuggerPluginPrivate::startRemoteCdbSession() sp.toolChainAbi = Abi(hostAbi.architecture(), Abi::WindowsOS, Abi::WindowsMsvc2010Flavor, Abi::PEFormat, hostAbi.wordWidth()); sp.startMode = AttachToRemoteServer; + sp.closeMode = KillAtClose; StartRemoteCdbDialog dlg(mainWindow()); QString previousConnection = configValue(connectionKey).toString(); if (previousConnection.isEmpty()) @@ -1666,6 +1671,7 @@ void DebuggerPluginPrivate::attachToRemoteServer() DebuggerStartParameters sp; if (StartRemoteDialog::run(mainWindow(), m_coreSettings, false, &sp)) { sp.startMode = AttachToRemoteServer; + sp.closeMode = KillAtClose; sp.useServerStartScript = false; sp.serverStartScript.clear(); if (RunControl *rc = createDebugger(sp)) @@ -1742,6 +1748,7 @@ void DebuggerPluginPrivate::attachedToProcess(const QString &channel, sp.sysroot = sysroot; sp.executable = localExecutable; sp.startMode = AttachToRemoteServer; + sp.closeMode = KillAtClose; sp.overrideStartScript.clear(); sp.useServerStartScript = false; sp.serverStartScript.clear(); @@ -1785,6 +1792,7 @@ void DebuggerPluginPrivate::attachToQmlPort() sp.sysroot = dlg.sysroot(); sp.startMode = AttachToRemoteServer; + sp.closeMode = KillAtClose; sp.languages = QmlLanguage; // diff --git a/src/plugins/debugger/debuggerstartparameters.h b/src/plugins/debugger/debuggerstartparameters.h index b5eef3f2262c7a335fb2a036852ae3fbad3cb8ea..4adc77a8d07bb2c38b9e5826c5d9028e023d38ce 100644 --- a/src/plugins/debugger/debuggerstartparameters.h +++ b/src/plugins/debugger/debuggerstartparameters.h @@ -67,6 +67,7 @@ public: useServerStartScript(false), requestRemoteSetup(false), startMode(NoStartMode), + closeMode(KillAtClose), executableUid(0), communicationChannel(CommunicationChannelTcpIp), serverPort(0), @@ -125,6 +126,7 @@ public: QString dumperLibrary; QStringList dumperLibraryLocations; DebuggerStartMode startMode; + DebuggerCloseMode closeMode; // For Symbian debugging. quint32 executableUid; diff --git a/src/plugins/debugger/gdb/abstractgdbadapter.h b/src/plugins/debugger/gdb/abstractgdbadapter.h index 05410a9d61ec79b555f4717c1533d7cae2008c90..51ed0bf5c591bcc96cc60b16cea2d9ce3200494a 100644 --- a/src/plugins/debugger/gdb/abstractgdbadapter.h +++ b/src/plugins/debugger/gdb/abstractgdbadapter.h @@ -75,7 +75,6 @@ public: virtual void setupInferior() = 0; virtual void runEngine() = 0; virtual void interruptInferior() = 0; - virtual void shutdownInferior() = 0; virtual void shutdownAdapter() = 0; virtual AbstractGdbProcess *gdbProc() = 0; diff --git a/src/plugins/debugger/gdb/attachgdbadapter.cpp b/src/plugins/debugger/gdb/attachgdbadapter.cpp index 6e1f91f17552586f62b47dc690eda1fcd4829e04..28c722a4e085d6e038bb5557401c22d91d8f6db3 100644 --- a/src/plugins/debugger/gdb/attachgdbadapter.cpp +++ b/src/plugins/debugger/gdb/attachgdbadapter.cpp @@ -116,11 +116,6 @@ void AttachGdbAdapter::interruptInferior() interruptLocalInferior(startParameters().attachPID); } -void AttachGdbAdapter::shutdownInferior() -{ - m_engine->defaultInferiorShutdown("detach"); -} - void AttachGdbAdapter::shutdownAdapter() { m_engine->notifyAdapterShutdownOk(); diff --git a/src/plugins/debugger/gdb/attachgdbadapter.h b/src/plugins/debugger/gdb/attachgdbadapter.h index 01a6feb9fc786206147ec65b26058678693596c4..e9a41ac49d96764b0e17bcfbdf463e4a2f729099 100644 --- a/src/plugins/debugger/gdb/attachgdbadapter.h +++ b/src/plugins/debugger/gdb/attachgdbadapter.h @@ -59,7 +59,6 @@ private: void setupInferior(); void runEngine(); void interruptInferior(); - void shutdownInferior(); void shutdownAdapter(); AbstractGdbProcess *gdbProc() { return &m_gdbProc; } diff --git a/src/plugins/debugger/gdb/codagdbadapter.cpp b/src/plugins/debugger/gdb/codagdbadapter.cpp index 1cc5135f5ebefeb9f28aedf8b8d258f36bd98811..1049e4a2f5f9d690afb9dab9b5c9921dbc9b4a3d 100644 --- a/src/plugins/debugger/gdb/codagdbadapter.cpp +++ b/src/plugins/debugger/gdb/codagdbadapter.cpp @@ -1237,11 +1237,6 @@ void CodaGdbAdapter::cleanup() } } -void CodaGdbAdapter::shutdownInferior() -{ - m_engine->defaultInferiorShutdown("kill"); -} - void CodaGdbAdapter::shutdownAdapter() { if (m_gdbProc.state() == QProcess::Running) { diff --git a/src/plugins/debugger/gdb/codagdbadapter.h b/src/plugins/debugger/gdb/codagdbadapter.h index d517cdedaf18a1c83ba36dc62cb8daa82aa8aff4..56efb451a8506a9bb23b3edb9fafe0a744975e9a 100644 --- a/src/plugins/debugger/gdb/codagdbadapter.h +++ b/src/plugins/debugger/gdb/codagdbadapter.h @@ -114,7 +114,6 @@ private: void setupInferior(); void runEngine(); void interruptInferior(); - void shutdownInferior(); void shutdownAdapter(); void sendRunControlTerminateCommand(); void handleRunControlTerminate(const Coda::CodaCommandResult &); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 1bb0d94bec3de4a55fa4bf1cc125bb114fdeb99e..db8cb4bac1c7a7cfafe0a7b5dc86a6c067fa3e32 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -1893,13 +1893,15 @@ void GdbEngine::shutdownInferior() { QTC_ASSERT(state() == InferiorShutdownRequested, qDebug() << state()); m_commandsToRunOnTemporaryBreak.clear(); - m_gdbAdapter->shutdownInferior(); -} - -void GdbEngine::defaultInferiorShutdown(const char *cmd) -{ - QTC_ASSERT(state() == InferiorShutdownRequested, qDebug() << state()); - postCommand(cmd, NeedsStop | LosesChild, CB(handleInferiorShutdown)); + switch (startParameters().closeMode) { + case KillAtClose: + postCommand("kill", NeedsStop | LosesChild, CB(handleInferiorShutdown)); + break; + case DetachAtClose: + postCommand("detach", NeedsStop | LosesChild, CB(handleInferiorShutdown)); + break; + } + QTC_ASSERT(false, notifyInferiorShutdownFailed()); } void GdbEngine::handleInferiorShutdown(const GdbResponse &response) diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 96c828e64a61e2adda118299672ff1d9e5091246..0403bcd12bd1a0fce9962a1e86cf9384df26c5d4 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -264,7 +264,6 @@ private: ////////// Gdb Process Management ////////// void handleNamespaceExtraction(const GdbResponse &response); void handleAdapterStarted(); - void defaultInferiorShutdown(const char *cmd); void loadInitScript(); void loadPythonDumpers(); void pythonDumpersFailed(); diff --git a/src/plugins/debugger/gdb/localplaingdbadapter.cpp b/src/plugins/debugger/gdb/localplaingdbadapter.cpp index 0b0060ffa63384a426be73090584350cdda01079..1e0ad9ff24d1d22607ca89f6905936f22d29f1a6 100644 --- a/src/plugins/debugger/gdb/localplaingdbadapter.cpp +++ b/src/plugins/debugger/gdb/localplaingdbadapter.cpp @@ -114,11 +114,6 @@ void LocalPlainGdbAdapter::runEngine() AbstractPlainGdbAdapter::runEngine(); } -void LocalPlainGdbAdapter::shutdownInferior() -{ - m_engine->defaultInferiorShutdown("kill"); -} - void LocalPlainGdbAdapter::shutdownAdapter() { showMessage(_("PLAIN ADAPTER SHUTDOWN %1").arg(state())); diff --git a/src/plugins/debugger/gdb/localplaingdbadapter.h b/src/plugins/debugger/gdb/localplaingdbadapter.h index ced097faac34d752aa66227ab4fde3542e222c38..39181bac7e629884158ed1ad0e978a2f56343e7d 100644 --- a/src/plugins/debugger/gdb/localplaingdbadapter.h +++ b/src/plugins/debugger/gdb/localplaingdbadapter.h @@ -58,7 +58,6 @@ private: void setupInferior(); void runEngine(); void interruptInferior(); - void shutdownInferior(); void shutdownAdapter(); DumperHandling dumperHandling() const; diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp index 0e3dd9e0ffafa9790e512c471dd5d3e0307bdd0a..daf20e3df0a3d8226197faa05390d81cb07d9eac 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.cpp +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.cpp @@ -365,14 +365,6 @@ void RemoteGdbServerAdapter::handleInterruptInferior(const GdbResponse &response } } -void RemoteGdbServerAdapter::shutdownInferior() -{ - if (m_engine->startParameters().startMode == AttachToRemoteServer) - m_engine->defaultInferiorShutdown("detach"); - else - m_engine->defaultInferiorShutdown("kill"); -} - void RemoteGdbServerAdapter::shutdownAdapter() { m_engine->notifyAdapterShutdownOk(); diff --git a/src/plugins/debugger/gdb/remotegdbserveradapter.h b/src/plugins/debugger/gdb/remotegdbserveradapter.h index 9261797d6d406eb4daf7ed47dc23688f8f2f01c5..7a3f88d642e7773338481f6160aa2c2f4e0f6b3e 100644 --- a/src/plugins/debugger/gdb/remotegdbserveradapter.h +++ b/src/plugins/debugger/gdb/remotegdbserveradapter.h @@ -59,7 +59,6 @@ private: void setupInferior(); void runEngine(); void interruptInferior(); - void shutdownInferior(); void shutdownAdapter(); AbstractGdbProcess *gdbProc() { return &m_gdbProc; } diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp index 5913ade032161cd87ecc2c89c8e1fe4e3930c4d7..a3a7263b14aaaaf4e65d13721c724065eecbb816 100644 --- a/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp +++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.cpp @@ -98,11 +98,6 @@ void RemotePlainGdbAdapter::handleApplicationOutput(const QByteArray &output) showMessage(QString::fromUtf8(output), AppOutput); } -void RemotePlainGdbAdapter::shutdownInferior() -{ - m_engine->defaultInferiorShutdown("kill"); -} - void RemotePlainGdbAdapter::shutdownAdapter() { m_engine->notifyAdapterShutdownOk(); diff --git a/src/plugins/debugger/gdb/remoteplaingdbadapter.h b/src/plugins/debugger/gdb/remoteplaingdbadapter.h index b1e764457485c1ac7be1670973e0d2001873e7ae..7c19e10df893d32e7ef821f462d0efdfef805e6f 100644 --- a/src/plugins/debugger/gdb/remoteplaingdbadapter.h +++ b/src/plugins/debugger/gdb/remoteplaingdbadapter.h @@ -55,7 +55,6 @@ private: void startAdapter(); void setupInferior(); void interruptInferior(); - void shutdownInferior(); void shutdownAdapter(); void handleRemoteSetupDone(int gdbServerPort, int qmlPort); void handleRemoteSetupFailed(const QString &reason); diff --git a/src/plugins/debugger/gdb/termgdbadapter.cpp b/src/plugins/debugger/gdb/termgdbadapter.cpp index 8acff6ede484be22c330bc3edc30bc991100c366..135630e8758785f244cfef65ce725240d9e8093a 100644 --- a/src/plugins/debugger/gdb/termgdbadapter.cpp +++ b/src/plugins/debugger/gdb/termgdbadapter.cpp @@ -210,11 +210,6 @@ void TermGdbAdapter::stubExited() m_engine->notifyEngineIll(); } -void TermGdbAdapter::shutdownInferior() -{ - m_engine->defaultInferiorShutdown("kill"); -} - void TermGdbAdapter::shutdownAdapter() { m_engine->notifyAdapterShutdownOk(); diff --git a/src/plugins/debugger/gdb/termgdbadapter.h b/src/plugins/debugger/gdb/termgdbadapter.h index d9ecee078d6075733096f895b6df7c882f03d83a..b56d969cd2d79e5a70ca32839be885b8cfe6b847 100644 --- a/src/plugins/debugger/gdb/termgdbadapter.h +++ b/src/plugins/debugger/gdb/termgdbadapter.h @@ -62,7 +62,6 @@ private: void setupInferior(); void runEngine(); void interruptInferior(); - void shutdownInferior(); void shutdownAdapter(); AbstractGdbProcess *gdbProc() { return &m_gdbProc; }