diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 56a8c09b31a..511ed6623a6 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -1562,6 +1562,12 @@ class Dumper(DumperBase): def requestModuleSymbols(self, frame): self.handleCommand("target module list " + frame) + def createFullBacktrace(self, _ = None): + command = "thread backtrace all" + result = lldb.SBCommandReturnObject() + self.debugger.GetCommandInterpreter().HandleCommand(command, result) + self.report('full-backtrace="%s"' % self.hexencode(result.GetOutput())) + def executeDebuggerCommand(self, args): result = lldb.SBCommandReturnObject() command = args['command'] diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 2589063fff8..ad61ccacf85 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -108,7 +108,7 @@ LldbEngine::LldbEngine(const DebuggerStartParameters &startParameters) connect(debuggerCore()->action(AutoDerefPointers), SIGNAL(valueChanged(QVariant)), SLOT(updateLocals())); connect(debuggerCore()->action(CreateFullBacktrace), SIGNAL(triggered()), - SLOT(updateAll())); + SLOT(createFullBacktrace())); connect(debuggerCore()->action(UseDebuggingHelpers), SIGNAL(valueChanged(QVariant)), SLOT(updateLocals())); connect(debuggerCore()->action(UseDynamicType), SIGNAL(valueChanged(QVariant)), @@ -432,6 +432,8 @@ void LldbEngine::handleResponse(const QByteArray &response) refreshMemory(item); else if (name == "continuation") runContinuation(item); + else if (name == "full-backtrace") + showFullBacktrace(item); else if (name == "statusmessage") { QString msg = QString::fromUtf8(item.data()); if (msg.size()) @@ -441,6 +443,12 @@ void LldbEngine::handleResponse(const QByteArray &response) } } +void LldbEngine::showFullBacktrace(const GdbMi &data) +{ + debuggerCore()->openTextEditor(_("Backtrace $"), + QString::fromUtf8(QByteArray::fromHex(data.data()))); +} + void LldbEngine::runContinuation(const GdbMi &data) { const QByteArray target = data.data(); @@ -1252,6 +1260,10 @@ void LldbEngine::fetchDisassembler(DisassemblerAgent *agent) runCommand(cmd); } +void LldbEngine::createFullBacktrace() +{ + runCommand("createFullBacktrace"); +} void LldbEngine::fetchMemory(MemoryAgent *agent, QObject *editorToken, quint64 addr, quint64 length) diff --git a/src/plugins/debugger/lldb/lldbengine.h b/src/plugins/debugger/lldb/lldbengine.h index 3d43532d915..f8ba1420943 100644 --- a/src/plugins/debugger/lldb/lldbengine.h +++ b/src/plugins/debugger/lldb/lldbengine.h @@ -162,6 +162,7 @@ private: Q_SLOT void runEngine2(); Q_SLOT void updateAll(); Q_SLOT void updateLocals(); + Q_SLOT void createFullBacktrace(); void doUpdateLocals(UpdateParameters params); void refreshAll(const GdbMi &all); void refreshThreads(const GdbMi &threads); @@ -181,6 +182,7 @@ private: void refreshChangedBreakpoint(const GdbMi &bkpts); void refreshRemovedBreakpoint(const GdbMi &bkpts); void runContinuation(const GdbMi &data); + void showFullBacktrace(const GdbMi &data); typedef void (LldbEngine::*LldbCommandContinuation)();