diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp index feeb7b4445aac8c4b02e09fc68cad8e97d55227d..f462261d96751df26730f56f486d0af9a2d947c5 100644 --- a/src/plugins/debugger/debuggeractions.cpp +++ b/src/plugins/debugger/debuggeractions.cpp @@ -444,6 +444,10 @@ DebuggerSettings *DebuggerSettings::instance() item->setText(tr("Reload Full Stack")); instance->insertItem(ExpandStack, item); + item = new SavedAction(instance); + item->setText(tr("Create Full Backtrace")); + instance->insertItem(CreateFullBacktrace, item); + item = new SavedAction(instance); item->setText(tr("Execute Line")); instance->insertItem(ExecuteCommand, item); diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h index 66f762cade384699b7f10e29739629be3ec3c7f9..e1b4f87abab7db9ceba59cb29b446006c9e74f62 100644 --- a/src/plugins/debugger/debuggeractions.h +++ b/src/plugins/debugger/debuggeractions.h @@ -112,6 +112,7 @@ enum DebuggerActionCode // Stack MaximalStackDepth, ExpandStack, + CreateFullBacktrace, // Watchers & Locals WatchExpression, diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index 3482de3dc059543a7925b6828fc4e8bde7a82a74..cfd55b915cb1d6d03b3012c2a10141d1f85c651a 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -129,6 +129,7 @@ enum DebuggerCapabilities ReloadModuleSymbolsCapability = 0x100, BreakOnThrowAndCatchCapability = 0x200, ReturnFromFunctionCapability = 0x400, + CreateFullBacktraceCapability = 0x800, }; enum LogChannel diff --git a/src/plugins/debugger/debuggermanager.cpp b/src/plugins/debugger/debuggermanager.cpp index ee7d2ef52601fc7e88ba511ea1dcbb242950850a..bde5f76ac25be46cda036a0cc521b400d2033515 100644 --- a/src/plugins/debugger/debuggermanager.cpp +++ b/src/plugins/debugger/debuggermanager.cpp @@ -1947,6 +1947,12 @@ void DebuggerManager::updateWatchersWindow() d->m_watchHandler->model(WatchersWatch)->rowCount(QModelIndex()) > 0); } +void DebuggerManager::openTextEditor(const QString &titlePattern, + const QString &contents) +{ + d->m_plugin->openTextEditor(titlePattern, contents); +} + ////////////////////////////////////////////////////////////////////// // // AbstractDebuggerEngine diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index 87e23361ba9e8fe007d49144fb847654e682baa5..992903d94cf48a6fd8af226c26fcbff4a268e676 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -345,6 +345,8 @@ private: Internal::BreakpointData *findBreakpoint(const QString &fileName, int lineNumber); void setToolTipExpression(const QPoint &mousePos, TextEditor::ITextEditor *editor, int cursorPos); + void openTextEditor(const QString &titlePattern, + const QString &contents); DebuggerManagerPrivate *d; }; diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 3c1ffdfbb3a2431c38d1eeefce0de62177b93aba..0dc8aa0d619dc98ffdd4179d0df05d9790e7b4db 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1233,6 +1233,18 @@ void DebuggerPlugin::gotoLocation(const QString &file, int line, bool setMarker) } } +void DebuggerPlugin::openTextEditor(const QString &titlePattern0, + const QString &contents) +{ + QString titlePattern = titlePattern0; + EditorManager *editorManager = EditorManager::instance(); + QTC_ASSERT(editorManager, return); + Core::IEditor *editor = editorManager->openEditorWithContents( + Core::Constants::K_DEFAULT_TEXT_EDITOR_ID, &titlePattern, contents); + QTC_ASSERT(editor, return); + editorManager->activateEditor(editor); +} + void DebuggerPlugin::handleStateChanged(int state) { // Prevent it from beeing triggered on setup. diff --git a/src/plugins/debugger/debuggerplugin.h b/src/plugins/debugger/debuggerplugin.h index 9894f25e966f28e969c7ebef1b366a172f4217a2..061a7a60e5a8fe68007df30b630d5399f83a2e1e 100644 --- a/src/plugins/debugger/debuggerplugin.h +++ b/src/plugins/debugger/debuggerplugin.h @@ -107,6 +107,8 @@ private slots: void resetLocation(); void gotoLocation(const QString &file, int line, bool setMarker); + void openTextEditor(const QString &titlePattern, const QString &contents); + void breakpointSetRemoveMarginActionTriggered(); void breakpointEnableDisableMarginActionTriggered(); void onModeChanged(Core::IMode *mode); diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 965b8385a5a14188c08a279e19609873728fc972..aa5b5afe7e9bea0bdb14e428b9036e99125c6786 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -188,6 +188,8 @@ GdbEngine::GdbEngine(DebuggerManager *manager) : IDebuggerEngine(manager) connect(theDebuggerAction(AutoDerefPointers), SIGNAL(valueChanged(QVariant)), this, SLOT(setAutoDerefPointers(QVariant))); + connect(theDebuggerAction(CreateFullBacktrace), SIGNAL(triggered()), + this, SLOT(createFullBacktrace())); } void GdbEngine::connectDebuggingHelperActions() @@ -1795,7 +1797,8 @@ unsigned GdbEngine::debuggerCapabilities() const | RegisterCapability | ShowMemoryCapability | JumpToLineCapability | ReloadModuleCapability | ReloadModuleSymbolsCapability | BreakOnThrowAndCatchCapability - | ReturnFromFunctionCapability; + | ReturnFromFunctionCapability + | CreateFullBacktraceCapability; } void GdbEngine::continueInferiorInternal() @@ -4350,6 +4353,20 @@ bool GdbEngine::hasPython() const return m_hasPython; } +void GdbEngine::createFullBacktrace() +{ + postCommand("thread apply all bt", NeedsStop, CB(handleCreateFullBacktrace)); +} + +void GdbEngine::handleCreateFullBacktrace(const GdbResponse &response) +{ + if (response.resultClass == GdbResultDone) { + m_manager->openTextEditor(_("Backtrace $"), + _(response.data.findChild("consolestreamoutput").data())); + } +} + + // // Factory // diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h index f0216a5e8f314b940e06c983a648bbb4d403aaeb..dba14acdf001eed28b9f68eac15668c9f27dca3b 100644 --- a/src/plugins/debugger/gdb/gdbengine.h +++ b/src/plugins/debugger/gdb/gdbengine.h @@ -479,6 +479,9 @@ private: ////////// View & Data Stuff ////////// void handleDebuggingHelperEditValue(const GdbResponse &response); void handleDebuggingHelperSetup(const GdbResponse &response); + Q_SLOT void createFullBacktrace(); + void handleCreateFullBacktrace(const GdbResponse &response); + void updateLocals(const QVariant &cookie = QVariant()); void updateLocalsClassic(const QVariant &cookie); void updateLocalsPython(const QByteArray &varList); diff --git a/src/plugins/debugger/stackwindow.cpp b/src/plugins/debugger/stackwindow.cpp index 0d262588438e4f046632b04318cce433923b8e3a..b1b54277a80962961c96c0a52cda67f6fb9ea05c 100644 --- a/src/plugins/debugger/stackwindow.cpp +++ b/src/plugins/debugger/stackwindow.cpp @@ -102,12 +102,14 @@ void StackWindow::contextMenuEvent(QContextMenuEvent *ev) const unsigned engineCapabilities = m_manager->debuggerCapabilities(); menu.addAction(theDebuggerAction(ExpandStack)); - QAction *actCopyContents = menu.addAction(tr("Copy contents to clipboard")); + QAction *actCopyContents = menu.addAction(tr("Copy Contents to Clipboard")); actCopyContents->setEnabled(model() != 0); + menu.addAction(theDebuggerAction(CreateFullBacktrace)); + QAction *actShowMemory = menu.addAction(QString()); if (address.isEmpty()) { - actShowMemory->setText(tr("Open memory editor")); + actShowMemory->setText(tr("Open Memory Editor")); actShowMemory->setEnabled(false); } else { actShowMemory->setText(tr("Open Memory Editor at %1").arg(address));