diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp index 99826798c01ad7f1c809acd057bd0bccb62fa00c..f26b23ac8be18dd710bffee8e751e91672436931 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 be25319d2bbe8d66e617ef08b6cba43772566865..b3828cae455d56e6045d56b826068aada9dbe03d 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 67480dd9214fa37df411656e1af1080a48d5a954..e3793ed5e1c8591711fc514580b8a68a2a738fd4 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 16199e52ebb4e5feff47b61c82ff1b01860f5a75..17ac63a1705524b35e2d356d0531df65aae3925b 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 5913d0c30d39179ab344645bd54672f234a9eba9..432cef2878ea59cf44e37f4132ffc327235bbd9f 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 6c6cd6b740492b580899e485264c6a35710e4d0c..64c0eff0957fbd4100073135e152cb65a150051f 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);