debugger: add an "Memory View" item to the menu

Task-number: QTCREATORBUG-1600
This commit is contained in:
hjk
2010-09-09 17:58:26 +02:00
parent c3b816166f
commit 3e152fc8aa
5 changed files with 82 additions and 47 deletions

View File

@@ -58,6 +58,8 @@
#include <limits.h> #include <limits.h>
using namespace Core;
namespace Debugger { namespace Debugger {
namespace Internal { namespace Internal {
@@ -95,9 +97,9 @@ MemoryViewAgent::MemoryViewAgent(DebuggerEngine *engine, const QString &addr)
MemoryViewAgent::~MemoryViewAgent() MemoryViewAgent::~MemoryViewAgent()
{ {
Core::EditorManager *editorManager = Core::EditorManager::instance(); EditorManager *editorManager = EditorManager::instance();
QList<Core::IEditor *> editors; QList<IEditor *> editors;
foreach (QPointer<Core::IEditor> editor, m_editors) foreach (QPointer<IEditor> editor, m_editors)
if (editor) if (editor)
editors.append(editor.data()); editors.append(editor.data());
editorManager->closeEditors(editors); editorManager->closeEditors(editors);
@@ -105,25 +107,29 @@ MemoryViewAgent::~MemoryViewAgent()
void MemoryViewAgent::createBinEditor(quint64 addr) void MemoryViewAgent::createBinEditor(quint64 addr)
{ {
Core::EditorManager *editorManager = Core::EditorManager::instance(); EditorManager *editorManager = EditorManager::instance();
QString titlePattern = tr("Memory $"); QString titlePattern = tr("Memory $");
Core::IEditor *editor = editorManager->openEditorWithContents( IEditor *editor = editorManager->openEditorWithContents(
Core::Constants::K_DEFAULT_BINARY_EDITOR_ID, Core::Constants::K_DEFAULT_BINARY_EDITOR_ID,
&titlePattern); &titlePattern);
if (editor) { if (editor) {
connect(editor->widget(), SIGNAL(lazyDataRequested(Core::IEditor *, quint64,bool)),
this, SLOT(fetchLazyData(Core::IEditor *, quint64,bool)));
connect(editor->widget(), SIGNAL(newWindowRequested(quint64)),
this, SLOT(createBinEditor(quint64)));
connect(editor->widget(), connect(editor->widget(),
SIGNAL(newRangeRequested(Core::IEditor *, quint64)), this, SIGNAL(lazyDataRequested(Core::IEditor *, quint64,bool)),
SLOT(fetchLazyData(Core::IEditor *, quint64,bool)));
connect(editor->widget(),
SIGNAL(newWindowRequested(quint64)),
SLOT(createBinEditor(quint64)));
connect(editor->widget(),
SIGNAL(newRangeRequested(Core::IEditor *, quint64)),
SLOT(provideNewRange(Core::IEditor*,quint64))); SLOT(provideNewRange(Core::IEditor*,quint64)));
connect(editor->widget(), SIGNAL(startOfFileRequested(Core::IEditor *)), connect(editor->widget(),
this, SLOT(handleStartOfFileRequested(Core::IEditor*))); SIGNAL(startOfFileRequested(Core::IEditor *)),
connect(editor->widget(), SIGNAL(endOfFileRequested(Core::IEditor *)), SLOT(handleStartOfFileRequested(Core::IEditor*)));
this, SLOT(handleEndOfFileRequested(Core::IEditor*))); connect(editor->widget(),
SIGNAL(endOfFileRequested(Core::IEditor *)),
SLOT(handleEndOfFileRequested(Core::IEditor*)));
m_editors << editor; m_editors << editor;
editorManager->activateEditor(editor, Core::EditorManager::NoModeSwitch); editorManager->activateEditor(editor, EditorManager::NoModeSwitch);
QMetaObject::invokeMethod(editor->widget(), "setNewWindowRequestAllowed"); QMetaObject::invokeMethod(editor->widget(), "setNewWindowRequestAllowed");
QMetaObject::invokeMethod(editor->widget(), "setLazyData", QMetaObject::invokeMethod(editor->widget(), "setLazyData",
Q_ARG(quint64, addr), Q_ARG(int, DataRange), Q_ARG(int, BinBlockSize)); Q_ARG(quint64, addr), Q_ARG(int, DataRange), Q_ARG(int, BinBlockSize));
@@ -136,7 +142,7 @@ void MemoryViewAgent::createBinEditor(quint64 addr)
} }
} }
void MemoryViewAgent::fetchLazyData(Core::IEditor *editor, quint64 block, bool sync) void MemoryViewAgent::fetchLazyData(IEditor *editor, quint64 block, bool sync)
{ {
Q_UNUSED(sync); // FIXME: needed support for incremental searching Q_UNUSED(sync); // FIXME: needed support for incremental searching
m_engine->fetchMemory(this, editor, BinBlockSize * block, BinBlockSize); m_engine->fetchMemory(this, editor, BinBlockSize * block, BinBlockSize);
@@ -145,15 +151,15 @@ void MemoryViewAgent::fetchLazyData(Core::IEditor *editor, quint64 block, bool s
void MemoryViewAgent::addLazyData(QObject *editorToken, quint64 addr, void MemoryViewAgent::addLazyData(QObject *editorToken, quint64 addr,
const QByteArray &ba) const QByteArray &ba)
{ {
Core::IEditor *editor = qobject_cast<Core::IEditor *>(editorToken); IEditor *editor = qobject_cast<IEditor *>(editorToken);
if (editor && editor->widget()) { if (editor && editor->widget()) {
Core::EditorManager::instance()->activateEditor(editor, Core::EditorManager::NoModeSwitch); EditorManager::instance()->activateEditor(editor, EditorManager::NoModeSwitch);
QMetaObject::invokeMethod(editor->widget(), "addLazyData", QMetaObject::invokeMethod(editor->widget(), "addLazyData",
Q_ARG(quint64, addr / BinBlockSize), Q_ARG(QByteArray, ba)); Q_ARG(quint64, addr / BinBlockSize), Q_ARG(QByteArray, ba));
} }
} }
void MemoryViewAgent::provideNewRange(Core::IEditor *editor, quint64 address) void MemoryViewAgent::provideNewRange(IEditor *editor, quint64 address)
{ {
QMetaObject::invokeMethod(editor->widget(), "setLazyData", QMetaObject::invokeMethod(editor->widget(), "setLazyData",
Q_ARG(quint64, address), Q_ARG(int, DataRange), Q_ARG(quint64, address), Q_ARG(int, DataRange),
@@ -163,13 +169,13 @@ void MemoryViewAgent::provideNewRange(Core::IEditor *editor, quint64 address)
// Since we are not dealing with files, we take these signals to mean // Since we are not dealing with files, we take these signals to mean
// "move to start/end of range". This seems to make more sense than // "move to start/end of range". This seems to make more sense than
// jumping to the start or end of the address space, respectively. // jumping to the start or end of the address space, respectively.
void MemoryViewAgent::handleStartOfFileRequested(Core::IEditor *editor) void MemoryViewAgent::handleStartOfFileRequested(IEditor *editor)
{ {
QMetaObject::invokeMethod(editor->widget(), QMetaObject::invokeMethod(editor->widget(),
"setCursorPosition", Q_ARG(int, 0)); "setCursorPosition", Q_ARG(int, 0));
} }
void MemoryViewAgent::handleEndOfFileRequested(Core::IEditor *editor) void MemoryViewAgent::handleEndOfFileRequested(IEditor *editor)
{ {
QMetaObject::invokeMethod(editor->widget(), QMetaObject::invokeMethod(editor->widget(),
"setCursorPosition", Q_ARG(int, DataRange - 1)); "setCursorPosition", Q_ARG(int, DataRange - 1));
@@ -234,9 +240,9 @@ DisassemblerViewAgent::DisassemblerViewAgent(DebuggerEngine *engine)
DisassemblerViewAgent::~DisassemblerViewAgent() DisassemblerViewAgent::~DisassemblerViewAgent()
{ {
Core::EditorManager *editorManager = Core::EditorManager::instance(); EditorManager *editorManager = EditorManager::instance();
if (d->editor) if (d->editor)
editorManager->closeEditors(QList<Core::IEditor *>() << d->editor); editorManager->closeEditors(QList<IEditor *>() << d->editor);
d->editor = 0; d->editor = 0;
delete d->locationMark; delete d->locationMark;
d->locationMark = 0; d->locationMark = 0;
@@ -301,7 +307,7 @@ void DisassemblerViewAgentPrivate::configureMimeType()
TextEditor::PlainTextEditor *pe = qobject_cast<TextEditor::PlainTextEditor *>(editor->widget()); TextEditor::PlainTextEditor *pe = qobject_cast<TextEditor::PlainTextEditor *>(editor->widget());
QTC_ASSERT(pe, return); QTC_ASSERT(pe, return);
if (const Core::MimeType mtype = Core::ICore::instance()->mimeDatabase()->findByType(mimeType)) { if (const MimeType mtype = ICore::instance()->mimeDatabase()->findByType(mimeType)) {
pe->configure(mtype); pe->configure(mtype);
} else { } else {
qWarning("Assembler mimetype '%s' not found.", qPrintable(mimeType)); qWarning("Assembler mimetype '%s' not found.", qPrintable(mimeType));
@@ -343,7 +349,7 @@ void DisassemblerViewAgent::setContents(const QString &contents)
d->configureMimeType(); d->configureMimeType();
} }
editorManager->activateEditor(d->editor, Core::EditorManager::NoModeSwitch); editorManager->activateEditor(d->editor, EditorManager::NoModeSwitch);
plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget()); plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget());
if (plainTextEdit) { if (plainTextEdit) {

View File

@@ -543,6 +543,12 @@ void DebuggerEngine::handleCommand(int role, const QVariant &value)
d->handleContextMenuRequest(list); d->handleContextMenuRequest(list);
break; break;
} }
case RequestShowMemoryRole: {
qDebug() << "CREATING MEMORY VIEW";
(void) MemoryViewAgent(this, "0x0");
break;
}
} }
} }

View File

@@ -923,6 +923,7 @@ public slots:
void enableReverseDebuggingTriggered(const QVariant &value); void enableReverseDebuggingTriggered(const QVariant &value);
void languagesChanged(const Debugger::DebuggerLanguages &languages); void languagesChanged(const Debugger::DebuggerLanguages &languages);
void showStatusMessage(const QString &msg, int timeout = -1); void showStatusMessage(const QString &msg, int timeout = -1);
void openMemoryEditor();
DebuggerMainWindow *mainWindow() DebuggerMainWindow *mainWindow()
{ return qobject_cast<DebuggerMainWindow*> { return qobject_cast<DebuggerMainWindow*>
@@ -2346,8 +2347,7 @@ void DebuggerPluginPrivate::gotoLocation(const QString &file, int line, bool set
bool newEditor = false; bool newEditor = false;
ITextEditor *editor = ITextEditor *editor =
BaseTextEditor::openEditorAt(file, line, 0, QString(), BaseTextEditor::openEditorAt(file, line, 0, QString(),
Core::EditorManager::IgnoreNavigationHistory, EditorManager::IgnoreNavigationHistory, &newEditor);
&newEditor);
if (!editor) if (!editor)
return; return;
if (newEditor) if (newEditor)
@@ -2488,6 +2488,15 @@ void DebuggerPluginPrivate::scriptExpressionEntered(const QString &expression)
notifyCurrentEngine(RequestExecuteCommandRole, expression); notifyCurrentEngine(RequestExecuteCommandRole, expression);
} }
void DebuggerPluginPrivate::openMemoryEditor()
{
AddressDialog dialog;
if (dialog.exec() != QDialog::Accepted)
return;
QTC_ASSERT(m_watchersWindow, return);
m_watchersWindow->model()->setData(
QModelIndex(), dialog.address(), RequestShowMemoryRole);
}
/////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////
@@ -2704,6 +2713,8 @@ void DebuggerPlugin::extensionsInitialized()
d->m_uiSwitcher->initialize(); d->m_uiSwitcher->initialize();
d->m_watchersWindow->setVisible(false); d->m_watchersWindow->setVisible(false);
d->m_returnWindow->setVisible(false); d->m_returnWindow->setVisible(false);
connect(d->m_uiSwitcher, SIGNAL(memoryEditorRequested()),
d, SLOT(openMemoryEditor()));
// time gdb -i mi -ex 'debuggerplugin.cpp:800' -ex r -ex q bin/qtcreator.bin // time gdb -i mi -ex 'debuggerplugin.cpp:800' -ex r -ex q bin/qtcreator.bin
const QByteArray env = qgetenv("QTC_DEBUGGER_TEST"); const QByteArray env = qgetenv("QTC_DEBUGGER_TEST");

View File

@@ -73,15 +73,11 @@
#include <QtCore/QSettings> #include <QtCore/QSettings>
namespace Debugger { namespace Debugger {
using namespace Debugger::Internal; namespace Internal {
DockWidgetEventFilter::DockWidgetEventFilter(QObject *parent) DockWidgetEventFilter::DockWidgetEventFilter(QObject *parent)
: QObject(parent) : QObject(parent)
{ {}
}
bool DockWidgetEventFilter::eventFilter(QObject *obj, QEvent *event) bool DockWidgetEventFilter::eventFilter(QObject *obj, QEvent *event)
{ {
@@ -125,6 +121,7 @@ struct DebuggerUISwitcherPrivate
DebuggerLanguages m_activeDebugLanguages; DebuggerLanguages m_activeDebugLanguages;
QAction *m_activateCppAction; QAction *m_activateCppAction;
QAction *m_activateQmlAction; QAction *m_activateQmlAction;
QAction *m_openMemoryEditorAction;
bool m_qmlEnabled; bool m_qmlEnabled;
Core::ActionContainer *m_viewsMenu; Core::ActionContainer *m_viewsMenu;
@@ -154,6 +151,7 @@ DebuggerUISwitcherPrivate::DebuggerUISwitcherPrivate(DebuggerUISwitcher *q)
, m_activeDebugLanguages(AnyLanguage) , m_activeDebugLanguages(AnyLanguage)
, m_activateCppAction(0) , m_activateCppAction(0)
, m_activateQmlAction(0) , m_activateQmlAction(0)
, m_openMemoryEditorAction(0)
, m_qmlEnabled(false) , m_qmlEnabled(false)
, m_viewsMenu(0) , m_viewsMenu(0)
, m_debugMenu(0) , m_debugMenu(0)
@@ -164,8 +162,12 @@ DebuggerUISwitcherPrivate::DebuggerUISwitcherPrivate(DebuggerUISwitcher *q)
DebuggerUISwitcher *DebuggerUISwitcherPrivate::m_instance = 0; DebuggerUISwitcher *DebuggerUISwitcherPrivate::m_instance = 0;
DebuggerUISwitcher::DebuggerUISwitcher(Core::BaseMode *mode, QObject* parent) : } // namespace Internal
QObject(parent), d(new DebuggerUISwitcherPrivate(this))
using namespace Internal;
DebuggerUISwitcher::DebuggerUISwitcher(Core::BaseMode *mode, QObject* parent)
: QObject(parent), d(new DebuggerUISwitcherPrivate(this))
{ {
mode->setWidget(createContents(mode)); mode->setWidget(createContents(mode));
@@ -325,15 +327,15 @@ void DebuggerUISwitcher::onModeChanged(Core::IMode *mode)
void DebuggerUISwitcher::hideInactiveWidgets() void DebuggerUISwitcher::hideInactiveWidgets()
{ {
// Hide all the debugger windows if mode is different.
if (d->m_inDebugMode)
return;
// Hide dock widgets manually in case they are floating. // Hide dock widgets manually in case they are floating.
if (!d->m_inDebugMode) {
// hide all the debugger windows if mode is different
foreach (QDockWidget *dockWidget, d->m_dockWidgets) { foreach (QDockWidget *dockWidget, d->m_dockWidgets) {
if (dockWidget->isFloating()) if (dockWidget->isFloating())
dockWidget->hide(); dockWidget->hide();
} }
} }
}
void DebuggerUISwitcher::createViewsMenuItems() void DebuggerUISwitcher::createViewsMenuItems()
{ {
@@ -344,8 +346,17 @@ void DebuggerUISwitcher::createViewsMenuItems()
d->m_debugMenu->addMenu(d->m_debuggerLanguageMenu, Core::Constants::G_DEFAULT_THREE); d->m_debugMenu->addMenu(d->m_debuggerLanguageMenu, Core::Constants::G_DEFAULT_THREE);
d->m_debuggerLanguageMenu->menu()->setTitle(tr("&Debug Languages")); d->m_debuggerLanguageMenu->menu()->setTitle(tr("&Debug Languages"));
d->m_openMemoryEditorAction = new QAction(this);
d->m_openMemoryEditorAction->setText(tr("Memory..."));
connect(d->m_openMemoryEditorAction, SIGNAL(triggered()),
SIGNAL(memoryEditorRequested()));
// Add menu items // Add menu items
Core::Command *cmd = am->registerAction(d->m_mainWindow->menuSeparator1(), Core::Command *cmd = 0;
cmd = am->registerAction(d->m_openMemoryEditorAction,
QLatin1String("Debugger.Views.OpenMemoryEditor"), globalcontext);
d->m_viewsMenu->addAction(cmd);
cmd = am->registerAction(d->m_mainWindow->menuSeparator1(),
QLatin1String("Debugger.Views.Separator1"), globalcontext); QLatin1String("Debugger.Views.Separator1"), globalcontext);
d->m_viewsMenu->addAction(cmd); d->m_viewsMenu->addAction(cmd);
cmd = am->registerAction(d->m_mainWindow->toggleLockedAction(), cmd = am->registerAction(d->m_mainWindow->toggleLockedAction(),
@@ -742,7 +753,8 @@ void DebuggerUISwitcher::updateDockWidgetSettings()
bool DebuggerUISwitcher::isQmlCppActive() const bool DebuggerUISwitcher::isQmlCppActive() const
{ {
return (d->m_activeDebugLanguages & CppLanguage) && (d->m_activeDebugLanguages & QmlLanguage); return (d->m_activeDebugLanguages & CppLanguage)
&& (d->m_activeDebugLanguages & QmlLanguage);
} }
bool DebuggerUISwitcher::isQmlActive() const bool DebuggerUISwitcher::isQmlActive() const

View File

@@ -61,9 +61,9 @@ namespace ProjectExplorer {
} }
namespace Debugger { namespace Debugger {
struct DebuggerUISwitcherPrivate;
namespace Internal { namespace Internal {
class DebuggerUISwitcherPrivate;
class DebuggerMainWindow; class DebuggerMainWindow;
}; };
@@ -122,8 +122,8 @@ signals:
// emit when user changes active languages from the menu. // emit when user changes active languages from the menu.
// Both UI and debugger startup are affected. // Both UI and debugger startup are affected.
void activeLanguagesChanged(Debugger::DebuggerLanguages activeLanguages); void activeLanguagesChanged(Debugger::DebuggerLanguages activeLanguages);
void dockResetRequested(const Debugger::DebuggerLanguages &activeLanguages); void dockResetRequested(const Debugger::DebuggerLanguages &activeLanguages);
void memoryEditorRequested();
private slots: private slots:
void updateUi(); void updateUi();
@@ -156,7 +156,7 @@ private:
QWidget *createContents(Core::BaseMode *mode); QWidget *createContents(Core::BaseMode *mode);
QWidget *createMainWindow(Core::BaseMode *mode); QWidget *createMainWindow(Core::BaseMode *mode);
DebuggerUISwitcherPrivate *d; Internal::DebuggerUISwitcherPrivate *d;
}; };
namespace Internal { namespace Internal {