aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhjk <[email protected]>2010-04-30 14:18:10 +0200
committerhjk <[email protected]>2010-04-30 14:22:48 +0200
commit5560f5e2f16bb7a42ca39c7c56d642b64fcb5091 (patch)
treec0545864df314a44166400f72a935ab32905baff
parent24d1fbd15b6495b46b34a907d1c4e46f78122836 (diff)
debugger: make it possible to bulk-assign breakpoints to threads
-rw-r--r--src/plugins/debugger/breakwindow.cpp21
-rw-r--r--src/plugins/debugger/breakwindow.h1
-rw-r--r--src/plugins/debugger/debuggermanager.h4
-rw-r--r--src/plugins/debugger/gdb/gdbengine.cpp12
-rw-r--r--src/plugins/debugger/stackhandler.cpp7
-rw-r--r--src/plugins/debugger/stackhandler.h1
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);