OSDN Git Service

debugger: don't retrieve the stack if we know we will continue stepping
authorhjk <qtc-committer@nokia.com>
Fri, 17 Dec 2010 12:07:17 +0000 (13:07 +0100)
committerhjk <qtc-committer@nokia.com>
Fri, 17 Dec 2010 12:07:17 +0000 (13:07 +0100)
src/plugins/debugger/gdb/gdbengine.cpp
src/plugins/debugger/gdb/gdbengine.h

index d53b996..c55daa8 100644 (file)
@@ -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;
 }
 
 
index 1dc37f8..5b356bc 100644 (file)
@@ -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;
 };