forked from qt-creator/qt-creator
Added Detaching to CDB.
This commit is contained in:
@@ -615,59 +615,73 @@ void CdbDebugEngine::processTerminated(unsigned long exitCode)
|
|||||||
m_d->m_debuggerManager->exitDebugger();
|
m_d->m_debuggerManager->exitDebugger();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CdbDebugEngine::exitDebugger()
|
// End debugging using
|
||||||
|
void CdbDebugEnginePrivate::endDebugging(EndDebuggingMode em)
|
||||||
{
|
{
|
||||||
|
enum Action { Detach, Terminate };
|
||||||
if (debugCDB)
|
if (debugCDB)
|
||||||
qDebug() << Q_FUNC_INFO;
|
qDebug() << Q_FUNC_INFO << em;
|
||||||
|
|
||||||
if (m_d->m_hDebuggeeProcess) {
|
if (m_mode == AttachCore || !m_hDebuggeeProcess)
|
||||||
|
return;
|
||||||
|
// Figure out action
|
||||||
|
Action action;
|
||||||
|
switch (em) {
|
||||||
|
case EndDebuggingAuto:
|
||||||
|
action = m_mode == AttachExternal ? Detach : Terminate;
|
||||||
|
break;
|
||||||
|
case EndDebuggingDetach:
|
||||||
|
action = Detach;
|
||||||
|
break;
|
||||||
|
case EndDebuggingTerminate:
|
||||||
|
action = Terminate;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (debugCDB)
|
||||||
|
qDebug() << Q_FUNC_INFO << action;
|
||||||
|
// Need a stopped debuggee to act
|
||||||
QString errorMessage;
|
QString errorMessage;
|
||||||
m_d->clearForRun();
|
const bool wasRunning = isDebuggeeRunning();
|
||||||
bool wasRunning = false;
|
if (wasRunning) { // Process must be stopped in order to terminate
|
||||||
// Terminate or detach if we are running
|
interruptInterferiorProcess(&errorMessage);
|
||||||
HRESULT hr;
|
|
||||||
switch (m_d->m_mode) {
|
|
||||||
case AttachExternal:
|
|
||||||
wasRunning = m_d->isDebuggeeRunning();
|
|
||||||
if (wasRunning) { // Process must be stopped in order to detach
|
|
||||||
m_d->interruptInterferiorProcess(&errorMessage);
|
|
||||||
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
|
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
|
||||||
}
|
}
|
||||||
hr = m_d->m_cif.debugClient->DetachCurrentProcess();
|
HRESULT hr;
|
||||||
|
switch (action) {
|
||||||
|
case Detach:
|
||||||
|
hr = m_cif.debugClient->DetachCurrentProcess();
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
errorMessage += msgComFailed("DetachCurrentProcess", hr);
|
errorMessage += msgComFailed("DetachCurrentProcess", hr);
|
||||||
if (debugCDB)
|
|
||||||
qDebug() << Q_FUNC_INFO << "detached" << msgDebugEngineComResult(hr);
|
|
||||||
break;
|
break;
|
||||||
case StartExternal:
|
case Terminate:
|
||||||
case StartInternal:
|
hr = m_cif.debugClient->TerminateCurrentProcess();
|
||||||
wasRunning = m_d->isDebuggeeRunning();
|
|
||||||
if (wasRunning) { // Process must be stopped in order to terminate
|
|
||||||
m_d->interruptInterferiorProcess(&errorMessage);
|
|
||||||
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
|
|
||||||
}
|
|
||||||
// Terminate and wait for stop events.
|
|
||||||
hr = m_d->m_cif.debugClient->TerminateCurrentProcess();
|
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
errorMessage += msgComFailed("TerminateCurrentProcess", hr);
|
errorMessage += msgComFailed("TerminateCurrentProcess", hr);
|
||||||
if (!wasRunning) {
|
if (!wasRunning) {
|
||||||
hr = m_d->m_cif.debugClient->TerminateProcesses();
|
hr = m_cif.debugClient->TerminateProcesses();
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
errorMessage += msgComFailed("TerminateProcesses", hr);
|
errorMessage += msgComFailed("TerminateProcesses", hr);
|
||||||
}
|
}
|
||||||
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
|
QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
|
||||||
if (debugCDB)
|
break;
|
||||||
qDebug() << Q_FUNC_INFO << "terminated" << msgDebugEngineComResult(hr);
|
}
|
||||||
|
setDebuggeeHandles(0, 0);
|
||||||
|
m_engine->killWatchTimer();
|
||||||
|
if (!errorMessage.isEmpty()) {
|
||||||
|
errorMessage = QString::fromLatin1("There were errors trying to end debugging: %1").arg(errorMessage);
|
||||||
|
m_debuggerManagerAccess->showDebuggerOutput(QLatin1String("error"), errorMessage);
|
||||||
|
qWarning("%s\n", qPrintable(errorMessage));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
void CdbDebugEngine::exitDebugger()
|
||||||
case AttachCore:
|
{
|
||||||
break;
|
m_d->endDebugging();
|
||||||
}
|
}
|
||||||
m_d->setDebuggeeHandles(0, 0);
|
|
||||||
if (!errorMessage.isEmpty())
|
void CdbDebugEngine::detachDebugger()
|
||||||
qWarning("exitDebugger: %s\n", qPrintable(errorMessage));
|
{
|
||||||
}
|
m_d->endDebugging(CdbDebugEnginePrivate::EndDebuggingDetach);
|
||||||
killWatchTimer();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
CdbStackFrameContext *CdbDebugEnginePrivate::getStackFrameContext(int frameIndex, QString *errorMessage) const
|
CdbStackFrameContext *CdbDebugEnginePrivate::getStackFrameContext(int frameIndex, QString *errorMessage) const
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ public:
|
|||||||
virtual void setToolTipExpression(const QPoint &pos, const QString &exp);
|
virtual void setToolTipExpression(const QPoint &pos, const QString &exp);
|
||||||
virtual bool startDebugger();
|
virtual bool startDebugger();
|
||||||
virtual void exitDebugger();
|
virtual void exitDebugger();
|
||||||
|
virtual void detachDebugger();
|
||||||
virtual void updateWatchModel();
|
virtual void updateWatchModel();
|
||||||
|
|
||||||
virtual void stepExec();
|
virtual void stepExec();
|
||||||
|
|||||||
@@ -132,6 +132,9 @@ struct CdbDebugEnginePrivate
|
|||||||
bool attemptBreakpointSynchronization(QString *errorMessage);
|
bool attemptBreakpointSynchronization(QString *errorMessage);
|
||||||
void notifyCrashed();
|
void notifyCrashed();
|
||||||
|
|
||||||
|
enum EndDebuggingMode { EndDebuggingDetach, EndDebuggingTerminate, EndDebuggingAuto };
|
||||||
|
void endDebugging(EndDebuggingMode em = EndDebuggingAuto);
|
||||||
|
|
||||||
static bool executeDebuggerCommand(CIDebugControl *ctrl, const QString &command, QString *errorMessage);
|
static bool executeDebuggerCommand(CIDebugControl *ctrl, const QString &command, QString *errorMessage);
|
||||||
static bool evaluateExpression(CIDebugControl *ctrl, const QString &expression, DEBUG_VALUE *v, QString *errorMessage);
|
static bool evaluateExpression(CIDebugControl *ctrl, const QString &expression, DEBUG_VALUE *v, QString *errorMessage);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user