OSDN Git Service

debugger: try to make core file loading appear snappier
authorhjk <qtc-committer@nokia.com>
Tue, 21 Dec 2010 13:41:17 +0000 (14:41 +0100)
committerhjk <qtc-committer@nokia.com>
Tue, 21 Dec 2010 13:46:42 +0000 (14:46 +0100)
src/plugins/debugger/gdb/coregdbadapter.cpp
src/plugins/debugger/gdb/coregdbadapter.h
src/plugins/debugger/gdb/gdbengine.cpp

index 69afdb1..5f37b36 100644 (file)
@@ -75,7 +75,10 @@ void CoreGdbAdapter::startAdapter()
     QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
     showMessage(_("TRYING TO START ADAPTER"));
 
-    if (!m_engine->startGdb())
+    QStringList args;
+    args.append(_("-ex"));
+    args.append(_("set auto-solib-add off"));
+    if (!m_engine->startGdb(args))
         return;
 
     //if (m_executable.isEmpty()) {
@@ -149,10 +152,11 @@ void CoreGdbAdapter::handleTemporaryTargetCore(const GdbResponse &response)
 void CoreGdbAdapter::handleTemporaryDetach(const GdbResponse &response)
 {
     QTC_ASSERT(state() == EngineSetupRequested, qDebug() << state());
-    if (response.resultClass == GdbResultDone)
+    if (response.resultClass == GdbResultDone) {
         m_engine->notifyEngineSetupOk();
-    else
+    } else {
         m_engine->notifyEngineSetupFailed();
+    }
 }
 
 void CoreGdbAdapter::setupInferior()
@@ -193,6 +197,10 @@ void CoreGdbAdapter::handleTargetCore(const GdbResponse &response)
         m_engine->loadPythonDumpers();
         showMessage(tr("Attached to core."), StatusBar);
         m_engine->handleInferiorPrepared();
+        // Due to the auto-solib-add off setting, we don't have any
+        // symbols yet. Load them in order of importance.
+        m_engine->reloadStack(true);
+        m_engine->postCommand("info shared", CB(handleModulesList));
         return;
     }
     QString msg = tr("Attach to core \"%1\" failed:\n")
@@ -201,6 +209,23 @@ void CoreGdbAdapter::handleTargetCore(const GdbResponse &response)
     m_engine->notifyInferiorSetupFailed(msg);
 }
 
+void CoreGdbAdapter::handleModulesList(const GdbResponse &response)
+{
+    m_engine->handleModulesList(response);
+    loadSymbolsForStack();
+}
+
+void CoreGdbAdapter::loadSymbolsForStack()
+{
+    m_engine->loadSymbolsForStack();
+    QTimer::singleShot(1000, this, SLOT(loadAllSymbols()));
+}
+
+void CoreGdbAdapter::loadAllSymbols()
+{
+    m_engine->loadAllSymbols();
+}
+
 void CoreGdbAdapter::runEngine()
 {
     QTC_ASSERT(state() == EngineRunRequested, qDebug() << state());
index 1a0fafd..d7414ad 100644 (file)
@@ -63,12 +63,16 @@ private:
     void shutdownInferior();
     void shutdownAdapter();
 
+    Q_SLOT void loadSymbolsForStack();
+    Q_SLOT void loadAllSymbols();
+
     AbstractGdbProcess *gdbProc() { return &m_gdbProc; }
 
     void handleTemporaryDetach(const GdbResponse &response);
     void handleTemporaryTargetCore(const GdbResponse &response);
     void handleFileExecAndSymbols(const GdbResponse &response);
     void handleTargetCore(const GdbResponse &response);
+    void handleModulesList(const GdbResponse &response);
 
     QString m_executable;
     const QByteArray m_coreName;
index 729ede4..7765d72 100644 (file)
@@ -2636,7 +2636,7 @@ void GdbEngine::loadSymbolsForStack()
     const Modules &modules = modulesHandler()->modules();
     foreach (const StackFrame &frame, stackHandler()->frames()) {
         if (frame.function == _("??")) {
-            qDebug() << "LOAD FOR " << frame.address;
+            //qDebug() << "LOAD FOR " << frame.address;
             foreach (const Module &module, modules) {
                 if (module.startAddress <= frame.address
                         && frame.address < module.endAddress) {
@@ -4369,10 +4369,12 @@ void GdbEngine::handleInferiorPrepared()
 #endif
     }
 
-    // Initial attempt to set breakpoints
-    showStatusMessage(tr("Setting breakpoints..."));
-    showMessage(tr("Setting breakpoints..."));
-    attemptBreakpointSynchronization();
+    // Initial attempt to set breakpoints.
+    if (startParameters().startMode != AttachCore) {
+        showStatusMessage(tr("Setting breakpoints..."));
+        showMessage(tr("Setting breakpoints..."));
+        attemptBreakpointSynchronization();
+    }
 
     if (m_cookieForToken.isEmpty()) {
         finishInferiorSetup();