Some work towards functioning remote debugging

Fix gdb commands, state changes and signals emissions.
- There were some invalid gdb commands (e.g. "attach").
- There also were a number of unexplected state transitions.
This commit is contained in:
ck
2009-10-01 17:13:27 +02:00
committed by hjk
parent dbc042ff04
commit 3b12f5f1d6
2 changed files with 37 additions and 41 deletions

View File

@@ -86,12 +86,12 @@ void RemoteGdbAdapter::startAdapter()
gdbArgs.prepend(_("mi")); gdbArgs.prepend(_("mi"));
gdbArgs.prepend(_("-i")); gdbArgs.prepend(_("-i"));
if (!m_engine->m_outputCollector.listen()) { // if (!m_engine->m_outputCollector.listen()) {
emit adapterStartFailed(tr("Cannot set up communication with child process: %1") // emit adapterStartFailed(tr("Cannot set up communication with child process: %1")
.arg(m_engine->m_outputCollector.errorString())); // .arg(m_engine->m_outputCollector.errorString()));
return; // return;
} // }
gdbArgs.prepend(_("--tty=") + m_engine->m_outputCollector.serverName()); // gdbArgs.prepend(_("--tty=") + m_engine->m_outputCollector.serverName());
if (!startParameters().workingDir.isEmpty()) if (!startParameters().workingDir.isEmpty())
setWorkingDirectory(startParameters().workingDir); setWorkingDirectory(startParameters().workingDir);
@@ -193,20 +193,23 @@ void RemoteGdbAdapter::prepareInferior()
m_engine->postCommand(_("-exec-arguments ") m_engine->postCommand(_("-exec-arguments ")
+ startParameters().processArgs.join(_(" "))); + startParameters().processArgs.join(_(" ")));
//qq->breakHandler()->setAllPending(); m_engine->postCommand(_("set target-async on"), CB(handleSetTargetAsync));
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 void RemoteGdbAdapter::handleSetTargetAsync(const GdbResponse &response)
//postCommand(_("set target-async on"), CB(handleSetTargetAsync)); {
// a typical response on "old" gdb is: QTC_ASSERT(state() == InferiorPreparing, qDebug() << state());
// &"set target-async on\n" if (response.resultClass == GdbResultDone) {
//&"No symbol table is loaded. Use the \"file\" command.\n" //qq->breakHandler()->setAllPending();
//^error,msg="No symbol table is loaded. Use the \"file\" command." QFileInfo fi(startParameters().executable);
//postCommand(_("detach")); QString fileName = fi.absoluteFilePath();
//emit inferiorPreparationFailed(msg); 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) void RemoteGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
@@ -214,9 +217,8 @@ void RemoteGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
QTC_ASSERT(state() == InferiorPreparing, qDebug() << state()); QTC_ASSERT(state() == InferiorPreparing, qDebug() << state());
if (response.resultClass == GdbResultDone) { if (response.resultClass == GdbResultDone) {
//m_breakHandler->clearBreakMarkers(); //m_breakHandler->clearBreakMarkers();
QString channel = startParameters().remoteChannel; m_engine->setState(InferiorPrepared);
m_engine->postCommand(_("target remote %1").arg(channel), emit inferiorPrepared();
CB(handleTargetRemote));
} else if (response.resultClass == GdbResultError) { } else if (response.resultClass == GdbResultError) {
QString msg = tr("Starting remote executable failed:\n"); QString msg = tr("Starting remote executable failed:\n");
msg += __(response.data.findChild("msg").data()); msg += __(response.data.findChild("msg").data());
@@ -227,10 +229,11 @@ void RemoteGdbAdapter::handleFileExecAndSymbols(const GdbResponse &response)
void RemoteGdbAdapter::handleTargetRemote(const GdbResponse &record) void RemoteGdbAdapter::handleTargetRemote(const GdbResponse &record)
{ {
QTC_ASSERT(state() == InferiorPreparing, qDebug() << state()); QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
if (record.resultClass == GdbResultDone) { if (record.resultClass == GdbResultDone) {
setState(InferiorPrepared); // gdb server will stop the remote application itself.
emit inferiorPrepared(); debugMessage(_("INFERIOR STARTED"));
showStatusMessage(tr("Attached to stopped inferior."));
} else if (record.resultClass == GdbResultError) { } else if (record.resultClass == GdbResultError) {
// 16^error,msg="hd:5555: Connection timed out." // 16^error,msg="hd:5555: Connection timed out."
QString msg = tr("Connecting to remote server failed:\n"); QString msg = tr("Connecting to remote server failed:\n");
@@ -243,21 +246,14 @@ void RemoteGdbAdapter::handleTargetRemote(const GdbResponse &record)
void RemoteGdbAdapter::startInferior() void RemoteGdbAdapter::startInferior()
{ {
QTC_ASSERT(state() == InferiorStarting, qDebug() << state()); QTC_ASSERT(state() == InferiorStarting, qDebug() << state());
m_engine->postCommand(_("attach"), CB(handleFirstContinue)); QString channel = startParameters().remoteChannel;
}
void RemoteGdbAdapter::handleFirstContinue(const GdbResponse &record) // "target remote" does three things:
{ // (1) connects to the gdb server
QTC_ASSERT(state() == InferiorRunningRequested, qDebug() << state()); // (2) starts the remote application
if (record.resultClass == GdbResultDone) { // (3) stops the remote application (early, e.g. in the dynamic linker)
setState(InferiorStopped); m_engine->postCommand(_("target remote %1").arg(channel),
debugMessage(_("INFERIOR STARTED")); CB(handleTargetRemote));
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());
}
} }
void RemoteGdbAdapter::interruptInferior() void RemoteGdbAdapter::interruptInferior()

View File

@@ -71,11 +71,11 @@ private:
Q_SLOT void readUploadStandardError(); Q_SLOT void readUploadStandardError();
Q_SLOT void uploadProcError(QProcess::ProcessError error); Q_SLOT void uploadProcError(QProcess::ProcessError error);
void handleSetTargetAsync(const GdbResponse &response);
void handleFileExecAndSymbols(const GdbResponse &response); void handleFileExecAndSymbols(const GdbResponse &response);
void handleTargetRemote(const GdbResponse &response);
void handleKill(const GdbResponse &response); void handleKill(const GdbResponse &response);
void handleExit(const GdbResponse &response); void handleExit(const GdbResponse &response);
void handleTargetRemote(const GdbResponse &response);
void handleFirstContinue(const GdbResponse &response);
Q_SLOT void handleGdbStarted(); Q_SLOT void handleGdbStarted();
Q_SLOT void handleGdbError(QProcess::ProcessError error); Q_SLOT void handleGdbError(QProcess::ProcessError error);