From 4eb83cd8b2380c9b84e8d1b21a0a50c646f65e27 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Fri, 9 Apr 2010 14:55:09 +0200 Subject: [PATCH] debugger: basic support for address-based breakpoints --- src/plugins/debugger/breakhandler.cpp | 34 +++++++++++++++++++------ src/plugins/debugger/breakhandler.h | 1 + src/plugins/debugger/debuggeragents.cpp | 1 + src/plugins/debugger/debuggerplugin.cpp | 15 +++++++++-- src/plugins/debugger/gdb/gdbengine.cpp | 3 +++ 5 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 7b9046fa929..683117239c2 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -378,9 +378,16 @@ int BreakHandler::findBreakpoint(const BreakpointData &needle) const int BreakHandler::findBreakpoint(const QString &fileName, int lineNumber) const { - for (int index = 0; index != size(); ++index) - if (at(index)->isLocatedAt(fileName, lineNumber)) - return index; + if (lineNumber <= 0) { + QByteArray address = fileName.toLatin1(); + for (int index = 0; index != size(); ++index) + if (at(index)->bpAddress == address) + return index; + } else { + for (int index = 0; index != size(); ++index) + if (at(index)->isLocatedAt(fileName, lineNumber)) + return index; + } return -1; } @@ -710,11 +717,22 @@ void BreakHandler::setBreakpoint(const QString &fileName, int lineNumber) QFileInfo fi(fileName); BreakpointData *data = new BreakpointData(this); - data->fileName = fileName; - data->lineNumber = QByteArray::number(lineNumber); - data->pending = true; - data->setMarkerFileName(fileName); - data->setMarkerLineNumber(lineNumber); + if (lineNumber > 0) { + data->fileName = fileName; + data->lineNumber = QByteArray::number(lineNumber); + data->pending = true; + data->setMarkerFileName(fileName); + data->setMarkerLineNumber(lineNumber); + } else { + data->funcName = fileName; + data->lineNumber = 0; + data->pending = true; + // FIXME: Figure out in which disassembler view the Marker sits. + // Might be better to let the user code create the BreakpointData + // structure and insert it here. + data->setMarkerFileName(QString()); + data->setMarkerLineNumber(0); + } append(data); emit layoutChanged(); saveBreakpoints(); diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index c9d476657bb..de7b751e701 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -140,6 +140,7 @@ public: void removeAt(int index); // This also deletes the marker. void clear(); // This also deletes all the marker. int indexOf(BreakpointData *data) { return m_bp.indexOf(data); } + // If lineNumber < 0, interpret fileName as address. int findBreakpoint(const QString &fileName, int lineNumber) const; int findBreakpoint(const BreakpointData &data) const; // Returns index. BreakpointData *findBreakpoint(int bpNumber) const; diff --git a/src/plugins/debugger/debuggeragents.cpp b/src/plugins/debugger/debuggeragents.cpp index b18ce8916d6..2258c66083f 100644 --- a/src/plugins/debugger/debuggeragents.cpp +++ b/src/plugins/debugger/debuggeragents.cpp @@ -287,6 +287,7 @@ void DisassemblerViewAgent::setContents(const QString &contents) Core::Constants::K_DEFAULT_TEXT_EDITOR_ID, &titlePattern)); d->editor->setProperty("OpenedByDebugger", true); + d->editor->setProperty("DisassemblerView", true); QTC_ASSERT(d->editor, return); if ((plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget()))) (void) new DisassemblerHighlighter(plainTextEdit); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index aa7f479ddcb..2eb7529fd50 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -1128,8 +1128,19 @@ void DebuggerPlugin::requestContextMenu(TextEditor::ITextEditor *editor, { if (!isDebuggable(editor)) return; - QString fileName = editor->file()->fileName(); - QString position = fileName + QString(":%1").arg(lineNumber); + + QString fileName, position; + if (editor->property("DisassemblerView").toBool()) { + QString fileName = editor->file()->fileName(); + QString line = editor->contents() + .section('\n', lineNumber - 1, lineNumber - 1); + fileName = line.left(line.indexOf(QLatin1Char(' '))); + lineNumber = -1; + position = _("*") + fileName; + } else { + fileName = editor->file()->fileName(); + position = fileName + QString(":%1").arg(lineNumber); + } BreakpointData *data = m_manager->findBreakpoint(fileName, lineNumber); if (data) { diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index ae66cde0853..5a8d8679215 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2150,6 +2150,9 @@ QByteArray GdbEngine::breakpointLocation(int index) const BreakpointData *data = manager()->breakHandler()->at(index); if (!data->funcName.isEmpty()) return data->funcName.toLatin1(); + // In this case, data->funcName is something like '*0xdeadbeef' + if (data->lineNumber.toInt() == 0) + return data->funcName.toLatin1(); QString loc = data->useFullPath ? data->fileName : breakLocation(data->fileName); // The argument is simply a C-quoted version of the argument to the // non-MI "break" command, including the "original" quoting it wants. -- GitLab