diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index d53b9969557..c55daa89e0c 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -191,6 +191,7 @@ GdbEngine::GdbEngine(const DebuggerStartParameters &startParameters) m_pendingWatchRequests = 0; m_pendingBreakpointRequests = 0; m_commandsDoneCallback = 0; + m_stackNeeded = false; invalidateSourcesList(); m_gdbAdapter = createAdapter(); @@ -1432,24 +1433,33 @@ void GdbEngine::handleStop1(const GdbMi &data) showStatusMessage(reasontr); } - // - // Stack - // + // Let the event loop run before deciding whether to update the stack. + m_stackNeeded = true; // setTokenBarrier() might reset this. + m_currentThreadId = data.findChild("thread-id").data().toInt(); + QTimer::singleShot(0, this, SLOT(handleStop2())); +} + +void GdbEngine::handleStop2() +{ + // We are already continuing. + if (!m_stackNeeded) + return; + reloadStack(false); // Will trigger register reload. if (supportsThreads()) { - int currentId = data.findChild("thread-id").data().toInt(); if (m_gdbAdapter->isTrkAdapter()) { m_gdbAdapter->trkReloadThreads(); } else if (m_isMacGdb) { postCommand("-thread-list-ids", Discardable, - CB(handleThreadListIds), currentId); + CB(handleThreadListIds), m_currentThreadId); } else { // This is only available in gdb 7.1+. postCommand("-thread-info", Discardable, - CB(handleThreadInfo), currentId); + CB(handleThreadInfo), m_currentThreadId); } } + } void GdbEngine::handleInfoProc(const GdbResponse &response) @@ -2012,6 +2022,7 @@ void GdbEngine::setTokenBarrier() if (debuggerCore()->boolSetting(LogTimeStamps)) showMessage(LogWindow::logTimeStamp(), LogMiscInput); m_oldestAcceptableToken = currentToken(); + m_stackNeeded = false; } diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index 1dc37f82d0e..5b356bc8167 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -284,6 +284,7 @@ private: ////////// Gdb Output, State & Capability Handling ////////// void handleStop0(const GdbMi &data); void handleStop1(const GdbResponse &response); void handleStop1(const GdbMi &data); + Q_SLOT void handleStop2(); StackFrame parseStackFrame(const GdbMi &mi, int level); void resetCommandQueue(); @@ -537,6 +538,10 @@ private: ////////// View & Data Stuff ////////// QString m_toolTipExpression; QPoint m_toolTipPos; + // For short-circuiting stack and thread list evaluation. + bool m_stackNeeded; + int m_currentThreadId; + // HACK: StackFrame m_targetFrame; };