From 2ee4363d1d7f1366af40700255d39cd8325027c0 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 24 Feb 2015 11:33:25 +0100 Subject: [PATCH] Debugger: Force LLDB round trip between stack and locals update The stack might produce data (such as as the QML context in native mixed debugging) that is needed for locals display. While this doesn't work yet with LLDB anyway, the change suppresses one soft access when accessing the top frame of an empty stack (the usual case on the first update). Change-Id: If931fbe940b8cda01cc6cc34429a2fcb33cd8d19 Reviewed-by: Christian Stenger --- share/qtcreator/debugger/lldbbridge.py | 5 ++++ src/plugins/debugger/lldb/lldbengine.cpp | 29 +++++++++++++++--------- src/plugins/debugger/lldb/lldbengine.h | 19 ++++++++-------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 7d8476f9e01..b7c24b6a0d3 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -871,6 +871,11 @@ class Dumper(DumperBase): result += ',limit="%d"' % limit result += '}' self.report(result) + self.reportContinuation(args) + + def reportContinuation(self, args): + if "continuation" in args: + self.report('continuation=\"%s\"' % args["continuation"]) def reportStackPosition(self): thread = self.currentThread() diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 2dd23177480..d2425f664cf 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -460,6 +460,8 @@ void LldbEngine::handleResponse(const QByteArray &response) refreshMemory(item); else if (name == "full-backtrace") showFullBacktrace(item); + else if (name == "continuation") + handleContinuation(item); else if (name == "statusmessage") { QString msg = QString::fromUtf8(item.data()); if (msg.size()) @@ -469,6 +471,15 @@ void LldbEngine::handleResponse(const QByteArray &response) } } +void LldbEngine::handleContinuation(const GdbMi &data) +{ + if (data.data() == "updateLocals") { + updateLocals(); + return; + } + QTC_ASSERT(false, qDebug() << "Unknown continuation: " << data.data()); +} + void LldbEngine::showFullBacktrace(const GdbMi &data) { Internal::openTextEditor(_("Backtrace $"), @@ -524,10 +535,10 @@ void LldbEngine::activateFrame(int frameIndex) DebuggerCommand cmd("activateFrame"); cmd.arg("index", frameIndex); cmd.arg("thread", threadsHandler()->currentThread().raw()); + cmd.arg("continuation", "updateLocals"); runCommand(cmd); reloadRegisters(); - updateLocals(); } void LldbEngine::selectThread(ThreadId threadId) @@ -793,8 +804,12 @@ bool LldbEngine::setToolTipExpression(TextEditor::TextEditorWidget *editorWidget void LldbEngine::updateAll() { reloadRegisters(); - updateStack(); - updateLocals(); + + DebuggerCommand cmd("reportStack"); + cmd.arg("nativeMixed", isNativeMixedActive()); + cmd.arg("stacklimit", action(MaximalStackDepth)->value().toInt()); + cmd.arg("continuation", "updateLocals"); + runCommand(cmd); } void LldbEngine::reloadFullStack() @@ -805,14 +820,6 @@ void LldbEngine::reloadFullStack() runCommand(cmd); } -void LldbEngine::updateStack() -{ - DebuggerCommand cmd("reportStack"); - cmd.arg("nativeMixed", isNativeMixedActive()); - cmd.arg("stacklimit", action(MaximalStackDepth)->value().toInt()); - runCommand(cmd); -} - ////////////////////////////////////////////////////////////////////// // // Watch specific stuff diff --git a/src/plugins/debugger/lldb/lldbengine.h b/src/plugins/debugger/lldb/lldbengine.h index 02fef25d6ee..ca9109d5fbe 100644 --- a/src/plugins/debugger/lldb/lldbengine.h +++ b/src/plugins/debugger/lldb/lldbengine.h @@ -132,16 +132,17 @@ private: QString errorMessage(QProcess::ProcessError error) const; bool hasCapability(unsigned cap) const; - Q_SLOT void handleLldbFinished(int, QProcess::ExitStatus status); - Q_SLOT void handleLldbError(QProcess::ProcessError error); - Q_SLOT void readLldbStandardOutput(); - Q_SLOT void readLldbStandardError(); - Q_SLOT void handleResponse(const QByteArray &data); - Q_SLOT void updateAll(); - Q_SLOT void updateStack(); - Q_SLOT void updateLocals(); - Q_SLOT void createFullBacktrace(); + void handleLldbFinished(int, QProcess::ExitStatus status); + void handleLldbError(QProcess::ProcessError error); + void readLldbStandardOutput(); + void readLldbStandardError(); + void handleResponse(const QByteArray &data); + void updateAll(); + void updateLocals(); + void createFullBacktrace(); void doUpdateLocals(UpdateParameters params); + void handleContinuation(const GdbMi &data); + void refreshAll(const GdbMi &all); void refreshThreads(const GdbMi &threads); void refreshStack(const GdbMi &stack);