From c3afba0f0d025439567c6ecc03670813e5a1ee62 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Mon, 29 Mar 2010 18:44:02 +0200 Subject: [PATCH] debugger: add a context menu action to the stackview to create a full backtrace in the main editor. Useful for sending bug reports. --- src/plugins/debugger/debuggeractions.cpp | 4 ++++ src/plugins/debugger/debuggeractions.h | 1 + src/plugins/debugger/debuggerconstants.h | 1 + src/plugins/debugger/debuggermanager.cpp | 6 ++++++ src/plugins/debugger/debuggermanager.h | 2 ++ src/plugins/debugger/debuggerplugin.cpp | 12 ++++++++++++ src/plugins/debugger/debuggerplugin.h | 2 ++ src/plugins/debugger/gdb/gdbengine.cpp | 19 ++++++++++++++++++- src/plugins/debugger/gdb/gdbengine.h | 3 +++ src/plugins/debugger/stackwindow.cpp | 6 ++++-- 10 files changed, 53 insertions(+), 3 deletions(-) diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp index feeb7b4445a..f462261d967 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 66f762cade3..e1b4f87abab 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 3482de3dc05..cfd55b915cb 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 ee7d2ef5260..bde5f76ac25 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 87e23361ba9..992903d94cf 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 3c1ffdfbb3a..0dc8aa0d619 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 9894f25e966..061a7a60e5a 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 965b8385a5a..aa5b5afe7e9 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 f0216a5e8f3..dba14acdf00 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 0d262588438..b1b54277a80 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)); -- GitLab