forked from qt-creator/qt-creator
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:
@@ -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()
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user