aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/debugger/gdb/remotegdbadapter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/debugger/gdb/remotegdbadapter.cpp')
-rw-r--r--src/plugins/debugger/gdb/remotegdbadapter.cpp78
1 files changed, 37 insertions, 41 deletions
diff --git a/src/plugins/debugger/gdb/remotegdbadapter.cpp b/src/plugins/debugger/gdb/remotegdbadapter.cpp
index 233f96e1dd..9dc6a48fd3 100644
--- a/src/plugins/debugger/gdb/remotegdbadapter.cpp
+++ b/src/plugins/debugger/gdb/remotegdbadapter.cpp
@@ -86,12 +86,12 @@ void RemoteGdbAdapter::startAdapter()
gdbArgs.prepend(_("mi"));
gdbArgs.prepend(_("-i"));
- if (!m_engine->m_outputCollector.listen()) {
- emit adapterStartFailed(tr("Cannot set up communication with child process: %1")
- .arg(m_engine->m_outputCollector.errorString()));
- return;
- }
- gdbArgs.prepend(_("--tty=") + m_engine->m_outputCollector.serverName());
+// if (!m_engine->m_outputCollector.listen()) {
+// emit adapterStartFailed(tr("Cannot set up communication with child process: %1")
+// .arg(m_engine->m_outputCollector.errorString()));
+// return;
+// }
+// gdbArgs.prepend(_("--tty=") + m_engine->m_outputCollector.serverName());
if (!startParameters().workingDir.isEmpty())
setWorkingDirectory(startParameters().workingDir);
@@ -193,20 +193,23 @@ void RemoteGdbAdapter::prepareInferior()
m_engine->postCommand(_("-exec-arguments ")
+ startParameters().processArgs.join(_(" ")));
- //qq->breakHandler()->setAllPending();
- QFileInfo fi(startParameters().executable);
- QString fileName = fi.absoluteFilePath();
- m_engine->postCommand(_("-file-exec-and-symbols \"%1\"").arg(fileName),
- CB(handleFileExecAndSymbols));
-
- // works only for > 6.8
- //postCommand(_("set target-async on"), CB(handleSetTargetAsync));
- // a typical response on "old" gdb is:
- // &"set target-async on\n"
- //&"No symbol table is loaded. Use the \"file\" command.\n"
- //^error,msg="No symbol table is loaded. Use the \"file\" command."
- //postCommand(_("detach"));
- //emit inferiorPreparationFailed(msg);
+ m_engine->postCommand(_("set target-async on"), CB(handleSetTargetAsync));
+}
+
+void RemoteGdbAdapter::handleSetTargetAsync(const GdbResponse &response)
+{
+ QTC_ASSERT(state() == InferiorPreparing, qDebug() << state());
+ if (response.resultClass == GdbResultDone) {
+ //qq->breakHandler()->setAllPending();
+ QFileInfo fi(startParameters().executable);
+ QString fileName = fi.absoluteFilePath();
+ m_engine->postCommand(_("-file-exec-and-symbols \"%1\"").arg(fileName),
+ CB(handleFileExecAndSymbols));
+ } else if (response.resultClass == GdbResultError) {
+ QString msg = tr("Adapter too old: does not support asynchronous mode.");
+ setState(InferiorPreparationFailed);
+ emit inferiorPreparationFailed(msg);
+ }
}
void RemoteGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
@@ -214,9 +217,8 @@ void RemoteGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
QTC_ASSERT(state() == InferiorPreparing, qDebug() << state());
if (response.resultClass == GdbResultDone) {
//m_breakHandler->clearBreakMarkers();
- QString channel = startParameters().remoteChannel;
- m_engine->postCommand(_("target remote %1").arg(channel),
- CB(handleTargetRemote));
+ m_engine->setState(InferiorPrepared);
+ emit inferiorPrepared();
} else if (response.resultClass == GdbResultError) {
QString msg = tr("Starting remote executable failed:\n");
msg += __(response.data.findChild("msg").data());
@@ -227,10 +229,11 @@ void RemoteGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
void RemoteGdbAdapter::handleTargetRemote(const GdbResponse &record)
{
- QTC_ASSERT(state() == InferiorPreparing, qDebug() << state());
+ QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
if (record.resultClass == GdbResultDone) {
- setState(InferiorPrepared);
- emit inferiorPrepared();
+ // gdb server will stop the remote application itself.
+ debugMessage(_("INFERIOR STARTED"));
+ showStatusMessage(tr("Attached to stopped inferior."));
} else if (record.resultClass == GdbResultError) {
// 16^error,msg="hd:5555: Connection timed out."
QString msg = tr("Connecting to remote server failed:\n");
@@ -243,21 +246,14 @@ void RemoteGdbAdapter::handleTargetRemote(const GdbResponse &record)
void RemoteGdbAdapter::startInferior()
{
QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
- m_engine->postCommand(_("attach"), CB(handleFirstContinue));
-}
-
-void RemoteGdbAdapter::handleFirstContinue(const GdbResponse &record)
-{
- QTC_ASSERT(state() == InferiorRunningRequested, qDebug() << state());
- if (record.resultClass == GdbResultDone) {
- setState(InferiorStopped);
- debugMessage(_("INFERIOR STARTED"));
- showStatusMessage(tr("Attached to stopped inferior."));
- } else if (record.resultClass == GdbResultError) {
- //QString msg = __(record.data.findChild("msg").data());
- QString msg1 = tr("Connecting to remote server failed:\n");
- emit inferiorStartFailed(msg1 + record.toString());
- }
+ QString channel = startParameters().remoteChannel;
+
+ // "target remote" does three things:
+ // (1) connects to the gdb server
+ // (2) starts the remote application
+ // (3) stops the remote application (early, e.g. in the dynamic linker)
+ m_engine->postCommand(_("target remote %1").arg(channel),
+ CB(handleTargetRemote));
}
void RemoteGdbAdapter::interruptInferior()