forked from qt-creator/qt-creator
lldb: have a proper Agent tranfering the sourcecode
This commit is contained in:
@@ -46,6 +46,7 @@ HEADERS += breakhandler.h \
|
|||||||
registerwindow.h \
|
registerwindow.h \
|
||||||
snapshothandler.h \
|
snapshothandler.h \
|
||||||
snapshotwindow.h \
|
snapshotwindow.h \
|
||||||
|
sourceagent.h \
|
||||||
sourcefileshandler.h \
|
sourcefileshandler.h \
|
||||||
sourcefileswindow.h \
|
sourcefileswindow.h \
|
||||||
stackframe.h \
|
stackframe.h \
|
||||||
@@ -85,6 +86,7 @@ SOURCES += breakhandler.cpp \
|
|||||||
registerwindow.cpp \
|
registerwindow.cpp \
|
||||||
snapshothandler.cpp \
|
snapshothandler.cpp \
|
||||||
snapshotwindow.cpp \
|
snapshotwindow.cpp \
|
||||||
|
sourceagent.cpp \
|
||||||
sourcefileshandler.cpp \
|
sourcefileshandler.cpp \
|
||||||
sourcefileswindow.cpp \
|
sourcefileswindow.cpp \
|
||||||
stackhandler.cpp \
|
stackhandler.cpp \
|
||||||
|
|||||||
@@ -2313,9 +2313,6 @@ void DebuggerPluginPrivate::startRemoteEngine()
|
|||||||
sp.connParams.uname = dlg.username();
|
sp.connParams.uname = dlg.username();
|
||||||
sp.connParams.pwd = dlg.password();
|
sp.connParams.pwd = dlg.password();
|
||||||
|
|
||||||
|
|
||||||
qDebug() << sp.connParams.host << sp.connParams.uname << sp.connParams.pwd;
|
|
||||||
|
|
||||||
sp.connParams.timeout = 5;
|
sp.connParams.timeout = 5;
|
||||||
sp.connParams.authType = SshConnectionParameters::AuthByPwd;
|
sp.connParams.authType = SshConnectionParameters::AuthByPwd;
|
||||||
sp.connParams.port = 22;
|
sp.connParams.port = 22;
|
||||||
|
|||||||
@@ -40,9 +40,7 @@
|
|||||||
#include "threadshandler.h"
|
#include "threadshandler.h"
|
||||||
#include "debuggeragents.h"
|
#include "debuggeragents.h"
|
||||||
#include "debuggerstreamops.h"
|
#include "debuggerstreamops.h"
|
||||||
#include <coreplugin/editormanager/editormanager.h>
|
#include "debuggercore.h"
|
||||||
#include <coreplugin/editormanager/ieditor.h>
|
|
||||||
#include <cppeditor/cppeditorconstants.h>
|
|
||||||
|
|
||||||
#include <QSysInfo>
|
#include <QSysInfo>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
@@ -426,8 +424,10 @@ void IPCEngineHost::rpcCallback(quint64 f, QByteArray payload)
|
|||||||
sh->setCurrentIndex(token);
|
sh->setCurrentIndex(token);
|
||||||
if (!sh->currentFrame().isUsable() || QFileInfo(sh->currentFrame().file).exists())
|
if (!sh->currentFrame().isUsable() || QFileInfo(sh->currentFrame().file).exists())
|
||||||
gotoLocation(sh->currentFrame(), true);
|
gotoLocation(sh->currentFrame(), true);
|
||||||
else
|
else if (!m_sourceAgents.contains(sh->currentFrame().file))
|
||||||
fetchFrameSource(token);
|
fetchFrameSource(token);
|
||||||
|
foreach(SourceAgent *agent, m_sourceAgents.values())
|
||||||
|
agent->updateLocationMarker();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case IPCEngineGuest::CurrentThreadChanged:
|
case IPCEngineGuest::CurrentThreadChanged:
|
||||||
@@ -562,14 +562,14 @@ void IPCEngineHost::rpcCallback(quint64 f, QByteArray payload)
|
|||||||
QDataStream s(payload);
|
QDataStream s(payload);
|
||||||
SET_NATIVE_BYTE_ORDER(s);
|
SET_NATIVE_BYTE_ORDER(s);
|
||||||
qint64 token;
|
qint64 token;
|
||||||
QString name;
|
QString path;
|
||||||
QString source;
|
QString source;
|
||||||
s >> token >> name >> source;
|
s >> token >> path >> source;
|
||||||
Core::EditorManager *editorManager = Core::EditorManager::instance();
|
SourceAgent *agent = new SourceAgent(this);
|
||||||
Core::IEditor *editor = editorManager->openEditorWithContents(CppEditor::Constants::CPPEDITOR_ID, &name, source);
|
agent->setSourceProducerName(startParameters().connParams.host);
|
||||||
editorManager->activateEditor(editor);
|
agent->setContent(path, source);
|
||||||
editor->gotoLine(stackHandler()->currentFrame().line, 0);
|
m_sourceAgents.insert(path, agent);
|
||||||
editor->setProperty(Debugger::Constants::OPENED_BY_DEBUGGER, true);
|
agent->updateLocationMarker();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#include "threadshandler.h"
|
#include "threadshandler.h"
|
||||||
#include "stackhandler.h"
|
#include "stackhandler.h"
|
||||||
#include "breakhandler.h"
|
#include "breakhandler.h"
|
||||||
|
#include "sourceagent.h"
|
||||||
|
|
||||||
#include <QtCore/QQueue>
|
#include <QtCore/QQueue>
|
||||||
#include <QtCore/QVariant>
|
#include <QtCore/QVariant>
|
||||||
@@ -129,6 +130,7 @@ private:
|
|||||||
quint64 m_cookie;
|
quint64 m_cookie;
|
||||||
QIODevice *m_device;
|
QIODevice *m_device;
|
||||||
QHash<quint64, DisassemblerViewAgent *> m_frameToDisassemblerAgent;
|
QHash<quint64, DisassemblerViewAgent *> m_frameToDisassemblerAgent;
|
||||||
|
QHash<QString, SourceAgent *> m_sourceAgents;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
187
src/plugins/debugger/sourceagent.cpp
Normal file
187
src/plugins/debugger/sourceagent.cpp
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||||
|
**
|
||||||
|
** Commercial Usage
|
||||||
|
**
|
||||||
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||||
|
** accordance with the Qt Commercial License Agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||||
|
** General Public License version 2.1 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||||
|
** packaging of this file. Please review the following information to
|
||||||
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||||
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||||
|
**
|
||||||
|
** If you are unsure which license is appropriate for your use, please
|
||||||
|
** contact the sales department at http://qt.nokia.com/contact.
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "sourceagent.h"
|
||||||
|
|
||||||
|
#include "breakhandler.h"
|
||||||
|
#include "debuggerengine.h"
|
||||||
|
#include "debuggercore.h"
|
||||||
|
#include "debuggerstringutils.h"
|
||||||
|
#include "stackframe.h"
|
||||||
|
#include "stackhandler.h"
|
||||||
|
|
||||||
|
#include <coreplugin/coreconstants.h>
|
||||||
|
#include <coreplugin/editormanager/editormanager.h>
|
||||||
|
#include <coreplugin/editormanager/ieditor.h>
|
||||||
|
#include <coreplugin/mimedatabase.h>
|
||||||
|
#include <coreplugin/icore.h>
|
||||||
|
|
||||||
|
#include <texteditor/basetextdocument.h>
|
||||||
|
#include <texteditor/basetexteditor.h>
|
||||||
|
#include <texteditor/basetextmark.h>
|
||||||
|
#include <texteditor/plaintexteditor.h>
|
||||||
|
#include <texteditor/texteditorconstants.h>
|
||||||
|
|
||||||
|
#include <cppeditor/cppeditorconstants.h>
|
||||||
|
|
||||||
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
|
#include <QtCore/QDebug>
|
||||||
|
#include <QtCore/QMetaObject>
|
||||||
|
#include <QtCore/QTimer>
|
||||||
|
|
||||||
|
#include <QtGui/QMessageBox>
|
||||||
|
#include <QtGui/QPlainTextEdit>
|
||||||
|
#include <QtGui/QTextBlock>
|
||||||
|
#include <QtGui/QTextCursor>
|
||||||
|
#include <QtGui/QIcon>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
using namespace Core;
|
||||||
|
|
||||||
|
namespace Debugger {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
class LocationMarkFoo : public TextEditor::ITextMark
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
LocationMarkFoo() {}
|
||||||
|
|
||||||
|
QIcon icon() const { return debuggerCore()->locationMarkIcon(); }
|
||||||
|
void updateLineNumber(int /*lineNumber*/) {}
|
||||||
|
void updateBlock(const QTextBlock & /*block*/) {}
|
||||||
|
void removedFromEditor() {}
|
||||||
|
void documentClosing() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
class SourceAgentPrivate
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
SourceAgentPrivate();
|
||||||
|
~SourceAgentPrivate();
|
||||||
|
|
||||||
|
public:
|
||||||
|
QPointer<TextEditor::ITextEditor> editor;
|
||||||
|
QPointer<DebuggerEngine> engine;
|
||||||
|
TextEditor::ITextMark *locationMark;
|
||||||
|
QString path;
|
||||||
|
QString producer;
|
||||||
|
};
|
||||||
|
|
||||||
|
SourceAgentPrivate::SourceAgentPrivate()
|
||||||
|
: editor(0)
|
||||||
|
, locationMark(new LocationMarkFoo)
|
||||||
|
, producer("remote")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
SourceAgentPrivate::~SourceAgentPrivate()
|
||||||
|
{
|
||||||
|
if (editor) {
|
||||||
|
EditorManager *editorManager = EditorManager::instance();
|
||||||
|
editorManager->closeEditors(QList<IEditor *>() << editor);
|
||||||
|
}
|
||||||
|
editor = 0;
|
||||||
|
delete locationMark;
|
||||||
|
}
|
||||||
|
|
||||||
|
SourceAgent::SourceAgent(DebuggerEngine *engine)
|
||||||
|
: QObject(0), d(new SourceAgentPrivate)
|
||||||
|
{
|
||||||
|
d->engine = engine;
|
||||||
|
}
|
||||||
|
|
||||||
|
SourceAgent::~SourceAgent()
|
||||||
|
{
|
||||||
|
delete d;
|
||||||
|
d = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SourceAgent::setSourceProducerName(const QString &name)
|
||||||
|
{
|
||||||
|
d->producer = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SourceAgent::setContent(const QString &filePath, const QString &content)
|
||||||
|
{
|
||||||
|
QTC_ASSERT(d, return);
|
||||||
|
using namespace Core;
|
||||||
|
using namespace TextEditor;
|
||||||
|
|
||||||
|
d->path = filePath;
|
||||||
|
|
||||||
|
EditorManager *editorManager = EditorManager::instance();
|
||||||
|
if (!d->editor) {
|
||||||
|
QString titlePattern = d->producer + QLatin1String(": ")
|
||||||
|
+ QFileInfo(filePath).fileName();
|
||||||
|
d->editor = qobject_cast<ITextEditor *>(
|
||||||
|
editorManager->openEditorWithContents(
|
||||||
|
CppEditor::Constants::CPPEDITOR_ID,
|
||||||
|
&titlePattern, content));
|
||||||
|
QTC_ASSERT(d->editor, return);
|
||||||
|
d->editor->setProperty(Debugger::Constants::OPENED_BY_DEBUGGER, true);
|
||||||
|
|
||||||
|
BaseTextEditor *baseTextEdit =
|
||||||
|
qobject_cast<BaseTextEditor *>(d->editor->widget());
|
||||||
|
if (baseTextEdit)
|
||||||
|
baseTextEdit->setRequestMarkEnabled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
editorManager->activateEditor(d->editor);
|
||||||
|
|
||||||
|
QPlainTextEdit *plainTextEdit =
|
||||||
|
qobject_cast<QPlainTextEdit *>(d->editor->widget());
|
||||||
|
QTC_ASSERT(plainTextEdit, return);
|
||||||
|
plainTextEdit->setReadOnly(true);
|
||||||
|
|
||||||
|
updateLocationMarker();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SourceAgent::updateLocationMarker()
|
||||||
|
{
|
||||||
|
QTC_ASSERT(d->editor, return);
|
||||||
|
|
||||||
|
d->editor->markableInterface()->removeMark(d->locationMark);
|
||||||
|
if (d->engine->stackHandler()->currentFrame().file == d->path) {
|
||||||
|
int lineNumber = d->engine->stackHandler()->currentFrame().line;
|
||||||
|
d->editor->markableInterface()->addMark(d->locationMark, lineNumber);
|
||||||
|
QPlainTextEdit *plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget());
|
||||||
|
QTC_ASSERT(plainTextEdit, return);
|
||||||
|
QTextCursor tc = plainTextEdit->textCursor();
|
||||||
|
QTextBlock block = tc.document()->findBlockByNumber(lineNumber - 1);
|
||||||
|
tc.setPosition(block.position());
|
||||||
|
plainTextEdit->setTextCursor(tc);
|
||||||
|
EditorManager *editorManager = EditorManager::instance();
|
||||||
|
editorManager->activateEditor(d->editor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace Debugger
|
||||||
62
src/plugins/debugger/sourceagent.h
Normal file
62
src/plugins/debugger/sourceagent.h
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||||
|
**
|
||||||
|
** Commercial Usage
|
||||||
|
**
|
||||||
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||||
|
** accordance with the Qt Commercial License Agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||||
|
** General Public License version 2.1 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||||
|
** packaging of this file. Please review the following information to
|
||||||
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||||
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||||
|
**
|
||||||
|
** If you are unsure which license is appropriate for your use, please
|
||||||
|
** contact the sales department at http://qt.nokia.com/contact.
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef DEBUGGER_SOURCE_AGENT_H
|
||||||
|
#define DEBUGGER_SOURCE_AGENT_H
|
||||||
|
|
||||||
|
#include <QtCore/QObject>
|
||||||
|
#include <QtCore/QHash>
|
||||||
|
#include <QtCore/QPointer>
|
||||||
|
#include <QtCore/QVector>
|
||||||
|
|
||||||
|
namespace Debugger {
|
||||||
|
|
||||||
|
class DebuggerEngine;
|
||||||
|
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
class SourceAgentPrivate;
|
||||||
|
class SourceAgent : public QObject
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit SourceAgent(Debugger::DebuggerEngine *engine);
|
||||||
|
~SourceAgent();
|
||||||
|
void setSourceProducerName(const QString &name);
|
||||||
|
void resetLocation();
|
||||||
|
void setContent(const QString &name, const QString &content);
|
||||||
|
void updateLocationMarker();
|
||||||
|
private:
|
||||||
|
SourceAgentPrivate *d;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace Debugger
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user