From 1bd71635580a6de09b7cc4ea14fcacacb59f2251 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Tue, 29 Sep 2009 16:17:01 +0200 Subject: [PATCH] debugger: cache disassembler results per-function. --- src/plugins/debugger/debuggeragents.cpp | 31 ++++++++++++++++++------ src/plugins/debugger/debuggeragents.h | 1 + src/plugins/debugger/debuggermanager.cpp | 26 ++++++++++---------- src/plugins/debugger/gdb/gdbengine.cpp | 6 ++--- 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/src/plugins/debugger/debuggeragents.cpp b/src/plugins/debugger/debuggeragents.cpp index b3e4a8e9a8b..a59dd4ef320 100644 --- a/src/plugins/debugger/debuggeragents.cpp +++ b/src/plugins/debugger/debuggeragents.cpp @@ -143,10 +143,10 @@ public: struct DisassemblerViewAgentPrivate { QPointer<TextEditor::ITextEditor> editor; - QString address; - QString function; + StackFrame frame; QPointer<DebuggerManager> manager; LocationMark2 *locationMark; + QHash<QString, QString> cache; }; /*! @@ -193,17 +193,33 @@ DisassemblerViewAgent::~DisassemblerViewAgent() { if (d->editor) d->editor->deleteLater(); + d->editor = 0; delete d; d = 0; } +void DisassemblerViewAgent::cleanup() +{ + d->cache.clear(); + //if (d->editor) + // d->editor->deleteLater(); + //d->editor = 0; +} + void DisassemblerViewAgent::setFrame(const StackFrame &frame) { + d->frame = frame; + if (!frame.function.isEmpty()) { + QHash<QString, QString>::ConstIterator it = + d->cache.find(frame.function + frame.file); + if (it != d->cache.end()) { + setContents(*it); + return; + } + } IDebuggerEngine *engine = d->manager->currentEngine(); QTC_ASSERT(engine, return); engine->fetchDisassembler(this, frame); - d->address = frame.address; - d->function = frame.function; } void DisassemblerViewAgent::setContents(const QString &contents) @@ -212,6 +228,7 @@ void DisassemblerViewAgent::setContents(const QString &contents) using namespace Core; using namespace TextEditor; + d->cache.insert(d->frame.function + d->frame.file, contents); QPlainTextEdit *plainTextEdit = 0; EditorManager *editorManager = EditorManager::instance(); if (!d->editor) { @@ -232,10 +249,10 @@ void DisassemblerViewAgent::setContents(const QString &contents) plainTextEdit->setPlainText(contents); d->editor->markableInterface()->removeMark(d->locationMark); - d->editor->setDisplayName(_("Disassembler (%1)").arg(d->function)); + d->editor->setDisplayName(_("Disassembler (%1)").arg(d->frame.function)); for (int pos = 0, line = 0; ; ++line, ++pos) { - if (contents.midRef(pos, d->address.size()) == d->address) { + if (contents.midRef(pos, d->frame.address.size()) == d->frame.address) { d->editor->markableInterface()->addMark(d->locationMark, line + 1); if (plainTextEdit) { QTextCursor tc = plainTextEdit->textCursor(); @@ -252,7 +269,7 @@ void DisassemblerViewAgent::setContents(const QString &contents) QString DisassemblerViewAgent::address() const { - return d->address; + return d->frame.address; } } // namespace Internal diff --git a/src/plugins/debugger/debuggeragents.h b/src/plugins/debugger/debuggeragents.h index ba993b0efdf..d0eba7776e7 100644 --- a/src/plugins/debugger/debuggeragents.h +++ b/src/plugins/debugger/debuggeragents.h @@ -85,6 +85,7 @@ public: void setFrame(const StackFrame &frame); Q_SLOT void setContents(const QString &contents); QString address() const; + void cleanup(); private: DisassemblerViewAgentPrivate *d; diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index e12afc9c2d9..67b1a454c47 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -254,9 +254,9 @@ static Debugger::Internal::IDebuggerEngine *scriptEngine = 0; static Debugger::Internal::IDebuggerEngine *tcfEngine = 0; static Debugger::Internal::IDebuggerEngine *winEngine = 0; -struct DebuggerManagerPrivate { - - DebuggerManagerPrivate(); +struct DebuggerManagerPrivate +{ + DebuggerManagerPrivate(DebuggerManager *manager); static DebuggerManager *instance; @@ -297,7 +297,7 @@ struct DebuggerManagerPrivate { bool m_busy; QTimer *m_statusTimer; QString m_lastPermanentStatusMessage; - DisassemblerViewAgent *m_disassemblerViewAgent; + DisassemblerViewAgent m_disassemblerViewAgent; IDebuggerEngine *m_engine; DebuggerState m_state; @@ -305,14 +305,15 @@ struct DebuggerManagerPrivate { DebuggerManager *DebuggerManagerPrivate::instance = 0; -DebuggerManagerPrivate::DebuggerManagerPrivate() - : m_startParameters(new DebuggerStartParameters) +DebuggerManagerPrivate::DebuggerManagerPrivate(DebuggerManager *manager) + : m_startParameters(new DebuggerStartParameters), + m_disassemblerViewAgent(manager) { m_inferiorPid = 0; - m_disassemblerViewAgent = 0; } -DebuggerManager::DebuggerManager() : d(new DebuggerManagerPrivate) +DebuggerManager::DebuggerManager() + : d(new DebuggerManagerPrivate(this)) { DebuggerManagerPrivate::instance = this; init(); @@ -1034,6 +1035,7 @@ void DebuggerManager::cleanupViews() watchHandler()->cleanup(); registerHandler()->removeAll(); d->m_sourceFilesWindow->removeAll(); + d->m_disassemblerViewAgent.cleanup(); } void DebuggerManager::exitDebugger() @@ -1342,9 +1344,7 @@ void DebuggerManager::resetLocation() void DebuggerManager::gotoLocation(const Debugger::Internal::StackFrame &frame, bool setMarker) { if (theDebuggerBoolSetting(OperateByInstruction) || !frame.isUsable()) { - if (!d->m_disassemblerViewAgent) - d->m_disassemblerViewAgent = new DisassemblerViewAgent(this); - d->m_disassemblerViewAgent->setFrame(frame); + d->m_disassemblerViewAgent.setFrame(frame); if (setMarker) resetLocation(); } else { @@ -1627,8 +1627,8 @@ void DebuggerManager::setState(DebuggerState state) QString msg = _("State changed from %1(%2) to %3(%4).") .arg(stateName(d->m_state)).arg(d->m_state).arg(stateName(state)).arg(state); - if (!((d->m_state == -1 && state == 0) || (d->m_state == 0 && state == 0))) - qDebug() << msg << d->m_state << state; + //if (!((d->m_state == -1 && state == 0) || (d->m_state == 0 && state == 0))) + // qDebug() << msg << d->m_state << state; if (!isAllowedTransition(d->m_state, state)) qDebug() << "UNEXPECTED STATE TRANSITION: " << msg; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 8d87ed9d0d5..4d9ad019dd0 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -728,10 +728,9 @@ void GdbEngine::postCommand(const QString &command, GdbCommandFlags flags, void GdbEngine::postCommandHelper(const GdbCommand &cmd) { if (!stateAcceptsGdbCommands(state())) { - qDebug() << _("NO GDB PROCESS RUNNING, CMD IGNORED: ") << cmd.command - << state(); PENDING_DEBUG(_("NO GDB PROCESS RUNNING, CMD IGNORED: ") + cmd.command); - debugMessage(_("NO GDB PROCESS RUNNING, CMD IGNORED: ") + cmd.command); + debugMessage(_("NO GDB PROCESS RUNNING, CMD IGNORED: %1 %2") + .arg(cmd.command).arg(state())); return; } @@ -1292,6 +1291,7 @@ void GdbEngine::handleStop2(const GdbMi &data) f.file = QFile::decodeName(fullName.data()); f.line = frame.findChild("line").data().toInt(); f.address = _(frame.findChild("addr").data()); + f.function = _(frame.findChild("func").data()); gotoLocation(f, true); } -- GitLab