From 5560f5e2f16bb7a42ca39c7c56d642b64fcb5091 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Fri, 30 Apr 2010 14:18:10 +0200 Subject: [PATCH] debugger: make it possible to bulk-assign breakpoints to threads --- src/plugins/debugger/breakwindow.cpp | 21 +++++++++++++++++++++ src/plugins/debugger/breakwindow.h | 1 + src/plugins/debugger/debuggermanager.h | 4 +++- src/plugins/debugger/gdb/gdbengine.cpp | 12 +++++------- src/plugins/debugger/stackhandler.cpp | 7 +++++++ src/plugins/debugger/stackhandler.h | 1 + 6 files changed, 38 insertions(+), 8 deletions(-) diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp index 99826798c01..f26b23ac8be 100644 --- a/src/plugins/debugger/breakwindow.cpp +++ b/src/plugins/debugger/breakwindow.cpp @@ -31,6 +31,7 @@ #include "debuggeractions.h" #include "debuggermanager.h" +#include "stackhandler.h" #include "ui_breakcondition.h" #include "ui_breakbyfunction.h" @@ -196,6 +197,13 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) new QAction(tr("Edit Breakpoint..."), &menu); editBreakpointAction->setEnabled(si.size() > 0); + int threadId = m_manager->threadsHandler()->currentThreadId(); + QString associateTitle = threadId == -1 + ? tr("Associate Breakpoint With All Threads") + : tr("Associate Breakpoint With Thread %1").arg(threadId); + QAction *associateBreakpointAction = new QAction(associateTitle, &menu); + associateBreakpointAction->setEnabled(si.size() > 0); + QAction *synchronizeAction = new QAction(tr("Synchronize Breakpoints"), &menu); synchronizeAction->setEnabled( @@ -231,6 +239,7 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) menu.addAction(deleteAction); menu.addAction(editBreakpointAction); + menu.addAction(associateBreakpointAction); menu.addAction(toggleEnabledAction); menu.addAction(pathAction); menu.addSeparator(); @@ -270,6 +279,8 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev) setAlwaysResizeColumnsToContents(!m_alwaysResizeColumnsToContents); else if (act == editBreakpointAction) editBreakpoint(si); + else if (act == associateBreakpointAction) + associateBreakpoint(si, threadId); else if (act == synchronizeAction) emit breakpointSynchronizationRequested(); else if (act == toggleEnabledAction) @@ -371,6 +382,16 @@ void BreakWindow::editBreakpoint(const QModelIndexList &list) emit breakpointSynchronizationRequested(); } +void BreakWindow::associateBreakpoint(const QModelIndexList &list, int threadId) +{ + QString str; + if (threadId != -1) + str = QString::number(threadId); + foreach (const QModelIndex &idx, list) + model()->setData(idx.sibling(idx.row(), 6), str); + emit breakpointSynchronizationRequested(); +} + void BreakWindow::resizeColumnsToContents() { for (int i = model()->columnCount(); --i >= 0; ) diff --git a/src/plugins/debugger/breakwindow.h b/src/plugins/debugger/breakwindow.h index be25319d2bb..b3828cae455 100644 --- a/src/plugins/debugger/breakwindow.h +++ b/src/plugins/debugger/breakwindow.h @@ -72,6 +72,7 @@ private: void deleteBreakpoints(const QModelIndexList &list); void deleteBreakpoints(QList<int> rows); void editBreakpoint(const QModelIndexList &list); + void associateBreakpoint(const QModelIndexList &list, int thread); void setBreakpointsEnabled(const QModelIndexList &list, bool enabled); void setBreakpointsFullPath(const QModelIndexList &list, bool fullpath); diff --git a/src/plugins/debugger/debuggermanager.h b/src/plugins/debugger/debuggermanager.h index 67480dd9214..e3793ed5e1c 100644 --- a/src/plugins/debugger/debuggermanager.h +++ b/src/plugins/debugger/debuggermanager.h @@ -287,7 +287,7 @@ public slots: // FIXME void operateByInstructionTriggered(); void startFailed(); -private: +public: Internal::ModulesHandler *modulesHandler() const; Internal::BreakHandler *breakHandler() const; Internal::RegisterHandler *registerHandler() const; @@ -295,6 +295,8 @@ private: Internal::ThreadsHandler *threadsHandler() const; Internal::WatchHandler *watchHandler() const; Internal::SnapshotHandler *snapshotHandler() const; + +private: Internal::SourceFilesWindow *sourceFileWindow() const; QWidget *threadsWindow() const; diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 16199e52ebb..17ac63a1705 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2544,15 +2544,13 @@ void GdbEngine::attemptBreakpointSynchronization() data->bpEnabled = false; continue; } - if (data->threadSpec != data->bpThreadSpec && !data->bpThreadSpec.isEmpty()) { + if (data->threadSpec != data->bpThreadSpec && !data->bpNumber.isEmpty()) { // The only way to change this seems to be to re-set the bp completely. //qDebug() << "FIXME: THREAD: " << data->threadSpec << data->bpThreadSpec; - //data->bpThreadSpec = data->threadSpec; - if (!data->bpNumber.isEmpty()) { - postCommand("-break-delete " + data->bpNumber, - NeedsStop | RebuildBreakpointModel); - sendInsertBreakpoint(index); - } + data->bpThreadSpec.clear(); + postCommand("-break-delete " + data->bpNumber, + NeedsStop | RebuildBreakpointModel); + sendInsertBreakpoint(index); continue; } if (data->bpAddress.startsWith("0x") diff --git a/src/plugins/debugger/stackhandler.cpp b/src/plugins/debugger/stackhandler.cpp index 5913d0c30d3..432cef2878e 100644 --- a/src/plugins/debugger/stackhandler.cpp +++ b/src/plugins/debugger/stackhandler.cpp @@ -361,6 +361,13 @@ QVariant ThreadsHandler::headerData(int section, Qt::Orientation orientation, in return QVariant(); } +int ThreadsHandler::currentThreadId() const +{ + if (m_currentIndex < 0 || m_currentIndex >= m_threads.size()) + return -1; + return m_threads[m_currentIndex].id; +} + void ThreadsHandler::setCurrentThread(int index) { if (index == m_currentIndex) diff --git a/src/plugins/debugger/stackhandler.h b/src/plugins/debugger/stackhandler.h index 6c6cd6b7404..64c0eff0957 100644 --- a/src/plugins/debugger/stackhandler.h +++ b/src/plugins/debugger/stackhandler.h @@ -119,6 +119,7 @@ class ThreadsHandler : public QAbstractTableModel public: ThreadsHandler(QObject *parent = 0); + int currentThreadId() const; void setCurrentThread(int index); void selectThread(int index); void setThreads(const QList<ThreadData> &threads); -- GitLab