Debugger: Merge GDB/LLDB process error handling

This also removes some of the "illegal" state transitions,
partially addressing QTCREATORBUG-14089.

Change-Id: I817d87a0b5e0a40285bc9b0880fef5bceaee3f16
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
This commit is contained in:
hjk
2015-03-05 11:11:32 +01:00
parent 4d2359443f
commit 39f904957a
6 changed files with 42 additions and 31 deletions

View File

@@ -1178,6 +1178,38 @@ void DebuggerEngine::notifyInferiorExited()
d->queueShutdownEngine(); d->queueShutdownEngine();
} }
void DebuggerEngine::notifyDebuggerProcessFinished(int exitCode,
QProcess::ExitStatus exitStatus, const QString &backendName)
{
showMessage(_("%1 PROCESS FINISHED, status %2, exit code %3")
.arg(backendName).arg(exitStatus).arg(exitCode));
switch (state()) {
case DebuggerFinished:
// Nothing to do.
break;
case EngineShutdownRequested:
notifyEngineShutdownOk();
break;
case InferiorRunOk:
// This could either be a real gdb/lldb crash or a quickly exited inferior
// in the terminal adapter. In this case the stub proc will die soon,
// too, so there's no need to act here.
showMessage(_("The %1 process exited somewhat unexpectedly.").arg(backendName));
notifyEngineSpontaneousShutdown();
break;
default: {
notifyEngineIll(); // Initiate shutdown sequence
const QString msg = exitStatus == QProcess::CrashExit ?
tr("The %1 process terminated.") :
tr("The %2 process terminated unexpectedly (exitCode %1)").arg(exitCode);
AsynchronousMessageBox::critical(tr("Unexpected %1 Exit").arg(backendName),
msg.arg(backendName));
break;
}
}
}
void DebuggerEngine::slaveEngineStateChanged(DebuggerEngine *slaveEngine, void DebuggerEngine::slaveEngineStateChanged(DebuggerEngine *slaveEngine,
DebuggerState state) DebuggerState state)
{ {

View File

@@ -35,6 +35,7 @@
#include "debuggerconstants.h" #include "debuggerconstants.h"
#include <QObject> #include <QObject>
#include <QProcess>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QDebug; class QDebug;
@@ -313,6 +314,8 @@ protected:
public: public:
virtual void notifyInferiorExited(); virtual void notifyInferiorExited();
void notifyDebuggerProcessFinished(int exitCode, QProcess::ExitStatus exitStatus,
const QString &backendName);
protected: protected:
virtual void notifyInferiorShutdownOk(); virtual void notifyInferiorShutdownOk();

View File

@@ -4366,33 +4366,12 @@ void GdbEngine::handleGdbError(QProcess::ProcessError error)
} }
} }
void GdbEngine::handleGdbFinished(int code, QProcess::ExitStatus type) void GdbEngine::handleGdbFinished(int exitCode, QProcess::ExitStatus exitStatus)
{ {
if (m_commandTimer.isActive()) if (m_commandTimer.isActive())
m_commandTimer.stop(); m_commandTimer.stop();
showMessage(_("GDB PROCESS FINISHED, status %1, code %2").arg(type).arg(code)); notifyDebuggerProcessFinished(exitCode, exitStatus, QLatin1String("GDB"));
switch (state()) {
case EngineShutdownRequested:
notifyEngineShutdownOk();
break;
case InferiorRunOk:
// This could either be a real gdb crash or a quickly exited inferior
// in the terminal adapter. In this case the stub proc will die soon,
// too, so there's no need to act here.
showMessage(_("The gdb process exited somewhat unexpectedly."));
notifyEngineSpontaneousShutdown();
break;
default: {
notifyEngineIll(); // Initiate shutdown sequence
const QString msg = type == QProcess::CrashExit ?
tr("The gdb process terminated.") :
tr("The gdb process terminated unexpectedly (code %1)").arg(code);
AsynchronousMessageBox::critical(tr("Unexpected GDB Exit"), msg);
break;
}
}
} }
void GdbEngine::abortDebugger() void GdbEngine::abortDebugger()

View File

@@ -132,7 +132,7 @@ protected: ////////// Gdb Process Management //////////
private slots: private slots:
friend class GdbPlainEngine; friend class GdbPlainEngine;
void handleInterruptDeviceInferior(const QString &error); void handleInterruptDeviceInferior(const QString &error);
void handleGdbFinished(int, QProcess::ExitStatus status); void handleGdbFinished(int exitCode, QProcess::ExitStatus exitStatus);
void handleGdbError(QProcess::ProcessError error); void handleGdbError(QProcess::ProcessError error);
void readDebugeeOutput(const QByteArray &data); void readDebugeeOutput(const QByteArray &data);
void readGdbStandardOutput(); void readGdbStandardOutput();

View File

@@ -903,8 +903,7 @@ void LldbEngine::doUpdateLocals(UpdateParameters params)
void LldbEngine::handleLldbError(QProcess::ProcessError error) void LldbEngine::handleLldbError(QProcess::ProcessError error)
{ {
qDebug() << "HANDLE LLDB ERROR"; showMessage(_("LLDB PROCESS ERROR: %1").arg(error));
showMessage(_("HANDLE LLDB ERROR"));
switch (error) { switch (error) {
case QProcess::Crashed: case QProcess::Crashed:
break; // will get a processExited() as well break; // will get a processExited() as well
@@ -947,11 +946,9 @@ QString LldbEngine::errorMessage(QProcess::ProcessError error) const
} }
} }
void LldbEngine::handleLldbFinished(int code, QProcess::ExitStatus type) void LldbEngine::handleLldbFinished(int exitCode, QProcess::ExitStatus exitStatus)
{ {
qDebug() << "LLDB FINISHED"; notifyDebuggerProcessFinished(exitCode, exitStatus, QLatin1String("LLDB"));
showMessage(_("LLDB PROCESS FINISHED, status %1, code %2").arg(type).arg(code));
notifyEngineSpontaneousShutdown();
} }
void LldbEngine::readLldbStandardError() void LldbEngine::readLldbStandardError()

View File

@@ -134,7 +134,7 @@ private:
QString errorMessage(QProcess::ProcessError error) const; QString errorMessage(QProcess::ProcessError error) const;
bool hasCapability(unsigned cap) const; bool hasCapability(unsigned cap) const;
void handleLldbFinished(int, QProcess::ExitStatus status); void handleLldbFinished(int exitCode, QProcess::ExitStatus exitStatus);
void handleLldbError(QProcess::ProcessError error); void handleLldbError(QProcess::ProcessError error);
void readLldbStandardOutput(); void readLldbStandardOutput();
void readLldbStandardError(); void readLldbStandardError();