diff options
author | Kent Hansen <khansen@trolltech.com> | 2009-06-12 12:58:17 +0200 |
---|---|---|
committer | Kent Hansen <khansen@trolltech.com> | 2009-06-12 12:58:17 +0200 |
commit | da101c777366793b11e8bb4714a26c754656ca0b (patch) | |
tree | eb1ce5574211aa20e939950f8d96780aac9ed686 | |
parent | 7db7c6bd5e47b6d329aba162cb1afd2d9e7b8757 (diff) |
make the remote debugger work (mostly)
-rw-r--r-- | debuggee/debuggee.pro | 2 | ||||
-rw-r--r-- | debuggee/main.cpp | 14 | ||||
-rw-r--r-- | debuggee/qscriptdebuggerconnector.cpp | 103 | ||||
-rw-r--r-- | debuggee/qscriptdebuggerconnector.h | 18 | ||||
-rw-r--r-- | main.cpp | 37 | ||||
-rw-r--r-- | qscriptdebuggermetatypes.cpp | 65 | ||||
-rw-r--r-- | qscriptremotetargetdebugger.cpp | 45 | ||||
-rw-r--r-- | qscriptremotetargetdebugger.h | 11 | ||||
-rw-r--r-- | remotescriptdebugger.pro | 2 |
9 files changed, 161 insertions, 136 deletions
diff --git a/debuggee/debuggee.pro b/debuggee/debuggee.pro index d4b3eed..de2047e 100644 --- a/debuggee/debuggee.pro +++ b/debuggee/debuggee.pro @@ -5,5 +5,5 @@ INCLUDEPATH += . QT += network script scripttools # Input SOURCES += main.cpp -SOURCES += qscriptdebuggerconnector.cpp +SOURCES += qscriptdebuggerconnector.cpp $$PWD/../qscriptdebuggermetatypes.cpp HEADERS += qscriptdebuggerconnector.h diff --git a/debuggee/main.cpp b/debuggee/main.cpp index d1a19d7..9167f54 100644 --- a/debuggee/main.cpp +++ b/debuggee/main.cpp @@ -1,15 +1,3 @@ -/**************************************************************************** -** -** Copyright (C) 2007-$THISYEAR$ $TROLLTECH$. All rights reserved. -** -** This file is part of the Qt Script Debug project on Trolltech Labs. -** -** $TROLLTECH_GPL_LICENSE$ -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ #include <QtScript> #include <qscriptdebuggerconnector.h> @@ -49,7 +37,7 @@ MyObject::MyObject(const QHostAddress &addr, quint16 port, bool connect, QObject void MyObject::connected() { -// qDebug("connected!!"); + qDebug("connected!!"); QStringList fileNames; QString path = QDir::currentPath(); fileNames << (path + QDir::separator() + "foo.qs") diff --git a/debuggee/qscriptdebuggerconnector.cpp b/debuggee/qscriptdebuggerconnector.cpp index c5fbdb3..830b0db 100644 --- a/debuggee/qscriptdebuggerconnector.cpp +++ b/debuggee/qscriptdebuggerconnector.cpp @@ -1,19 +1,8 @@ -/**************************************************************************** -** -** Copyright (C) 2007-$THISYEAR$ $TROLLTECH$. All rights reserved. -** -** This file is part of the Qt Script Debug project on Trolltech Labs. -** -** $TROLLTECH_GPL_LICENSE$ -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - #include "qscriptdebuggerconnector.h" -#include <QtNetwork> -#include <QtScript> +#include <QtCore/qeventloop.h> +#include <QtNetwork/qtcpserver.h> +#include <QtNetwork/qtcpsocket.h> +#include <QtScript/qscriptengine.h> #include <private/qscriptdebuggerbackend_p.h> #include <private/qscriptdebuggercommand_p.h> #include <private/qscriptdebuggerevent_p.h> @@ -22,66 +11,9 @@ #include <private/qscriptbreakpointdata_p.h> #include <private/qscriptdebuggerobjectsnapshotdelta_p.h> -#define DEBUGGERCONNECTOR_DEBUG - -Q_DECLARE_METATYPE(QScriptDebuggerCommand) -Q_DECLARE_METATYPE(QScriptDebuggerResponse) -Q_DECLARE_METATYPE(QScriptDebuggerEvent) -Q_DECLARE_METATYPE(QScriptContextInfo) -Q_DECLARE_METATYPE(QScriptContextInfoList) -Q_DECLARE_METATYPE(QScriptDebuggerValue) -Q_DECLARE_METATYPE(QScriptDebuggerValueList) -Q_DECLARE_METATYPE(QScriptValue::PropertyFlags) -Q_DECLARE_METATYPE(QScriptBreakpointData) -Q_DECLARE_METATYPE(QScriptBreakpointMap) -Q_DECLARE_METATYPE(QScriptScriptData) -Q_DECLARE_METATYPE(QScriptScriptMap) -Q_DECLARE_METATYPE(QScriptScriptsDelta) -Q_DECLARE_METATYPE(QScriptDebuggerValueProperty) -Q_DECLARE_METATYPE(QScriptDebuggerValuePropertyList) -Q_DECLARE_METATYPE(QScriptDebuggerObjectSnapshotDelta) -Q_DECLARE_METATYPE(QList<int>) -Q_DECLARE_METATYPE(QList<qint64>) - -void qScriptDebugRegisterMetaTypes() -{ - qMetaTypeId<QScriptDebuggerCommand>(); - qMetaTypeId<QScriptDebuggerResponse>(); - qMetaTypeId<QScriptDebuggerEvent>(); - qMetaTypeId<QScriptContextInfo>(); - qMetaTypeId<QScriptContextInfoList>(); - qMetaTypeId<QScriptDebuggerValue>(); - qMetaTypeId<QScriptDebuggerValueList>(); - qMetaTypeId<QScriptValue::PropertyFlags>(); - qMetaTypeId<QScriptBreakpointData>(); - qMetaTypeId<QScriptBreakpointMap>(); - qMetaTypeId<QScriptScriptData>(); - qMetaTypeId<QScriptScriptMap>(); - qMetaTypeId<QScriptScriptsDelta>(); - qMetaTypeId<QScriptDebuggerValueProperty>(); - qMetaTypeId<QScriptDebuggerValuePropertyList>(); - qMetaTypeId<QScriptDebuggerObjectSnapshotDelta>(); - qMetaTypeId<QList<int> >(); - qMetaTypeId<QList<qint64> >(); - - qRegisterMetaTypeStreamOperators<QScriptDebuggerCommand>("QScriptDebuggerCommand"); - qRegisterMetaTypeStreamOperators<QScriptDebuggerResponse>("QScriptDebuggerResponse"); - qRegisterMetaTypeStreamOperators<QScriptDebuggerEvent>("QScriptDebuggerEvent"); - qRegisterMetaTypeStreamOperators<QScriptContextInfo>("QScriptContextInfo"); - qRegisterMetaTypeStreamOperators<QScriptContextInfoList>("QScriptContextInfoList"); - qRegisterMetaTypeStreamOperators<QScriptBreakpointData>("QScriptBreakpointData"); - qRegisterMetaTypeStreamOperators<QScriptBreakpointMap>("QScriptBreakpointMap"); - qRegisterMetaTypeStreamOperators<QScriptScriptData>("QScriptScriptData"); - qRegisterMetaTypeStreamOperators<QScriptScriptMap>("QScriptScriptMap"); - qRegisterMetaTypeStreamOperators<QScriptScriptsDelta>("QScriptScriptsDelta"); - qRegisterMetaTypeStreamOperators<QScriptDebuggerValue>("QScriptDebuggerValue"); - qRegisterMetaTypeStreamOperators<QScriptDebuggerValueList>("QScriptDebuggerValueList"); - qRegisterMetaTypeStreamOperators<QScriptDebuggerValueProperty>("QScriptDebuggerValueProperty"); - qRegisterMetaTypeStreamOperators<QScriptDebuggerValuePropertyList>("QScriptDebuggerValuePropertyList"); - qRegisterMetaTypeStreamOperators<QScriptDebuggerObjectSnapshotDelta>("QScriptDebuggerObjectSnapshotDelta"); - qRegisterMetaTypeStreamOperators<QList<int> >("QList<int>"); - qRegisterMetaTypeStreamOperators<QList<qint64> >("QList<qint64>"); -} +// #define DEBUGGERCONNECTOR_DEBUG + +void qScriptDebugRegisterMetaTypes(); class QScriptRemoteTargetDebuggerBackend : public QObject, public QScriptDebuggerBackend @@ -303,11 +235,9 @@ void QScriptRemoteTargetDebuggerBackend::onReadyRead() } } -void QScriptRemoteTargetDebuggerBackend::resume() -{ - Q_ASSERT_X(false, Q_FUNC_INFO, "implement me"); -} - +/*! + \reimp +*/ void QScriptRemoteTargetDebuggerBackend::event(const QScriptDebuggerEvent &event) { if (m_state != ConnectedState) @@ -353,6 +283,19 @@ void QScriptRemoteTargetDebuggerBackend::event(const QScriptDebuggerEvent &event } /*! + \reimp +*/ +void QScriptRemoteTargetDebuggerBackend::resume() +{ + // quitting the event loops will cause event() to return (see above) + while (!m_eventLoopStack.isEmpty()) { + QEventLoop *eventLoop = m_eventLoopStack.takeFirst(); + if (eventLoop->isRunning()) + eventLoop->quit(); + } +} + +/*! Constructs a new QScriptDebuggerConnector object with the given \a parent. */ diff --git a/debuggee/qscriptdebuggerconnector.h b/debuggee/qscriptdebuggerconnector.h index b135ef5..67de9cc 100644 --- a/debuggee/qscriptdebuggerconnector.h +++ b/debuggee/qscriptdebuggerconnector.h @@ -1,29 +1,13 @@ -/**************************************************************************** -** -** Copyright (C) 2007-$THISYEAR$ $TROLLTECH$. All rights reserved. -** -** This file is part of the Qt Script Debug project on Trolltech Labs. -** -** $TROLLTECH_GPL_LICENSE$ -** -** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE -** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. -** -****************************************************************************/ - #ifndef QSCRIPTDEBUGGERCONNECTOR_H #define QSCRIPTDEBUGGERCONNECTOR_H #include <QtCore/qobject.h> #include <QtNetwork/qhostaddress.h> -#include <QtNetwork/qabstractsocket.h> +//#include <QtNetwork/qabstractsocket.h> class QScriptEngine; class QScriptRemoteTargetDebuggerBackend; -class QScriptValue; -class QTcpSocket; -class QTcpServer; class QScriptDebuggerConnector : public QObject { @@ -3,10 +3,45 @@ #include <QtNetwork> #include "qscriptremotetargetdebugger.h" +void qScriptDebugRegisterMetaTypes(); + int main(int argc, char **argv) { QApplication app(argc, argv); + + QHostAddress addr(QHostAddress::LocalHost); + quint16 port = 2000; + bool listen = false; + for (int i = 1; i < argc; ++i) { + QString arg(argv[i]); + arg = arg.trimmed(); + if(arg.startsWith("--")) { + QString opt; + QString val; + int split = arg.indexOf("="); + if(split > 0) { + opt = arg.mid(2).left(split-2); + val = arg.mid(split + 1).trimmed(); + } else { + opt = arg.mid(2); + } + if (opt == QLatin1String("address")) + addr.setAddress(val); + else if (opt == QLatin1String("port")) + port = val.toUShort(); + else if (opt == QLatin1String("listen")) + listen = true; + else if (opt == QLatin1String("help")) { + fprintf(stdout, "Usage: remote --address=ADDR --port=NUM [--listen]\n"); + return(-1); + } + } + } + + qScriptDebugRegisterMetaTypes(); QScriptRemoteTargetDebugger debugger; - debugger.attachTo(QHostAddress::LocalHost, 2000); + qDebug("attaching to %s:%d", qPrintable(addr.toString()), port); + debugger.attachTo(addr, port); + return app.exec(); } diff --git a/qscriptdebuggermetatypes.cpp b/qscriptdebuggermetatypes.cpp new file mode 100644 index 0000000..ac2289e --- /dev/null +++ b/qscriptdebuggermetatypes.cpp @@ -0,0 +1,65 @@ +#include <QtScript/qscriptcontextinfo.h> +#include <private/qscriptdebuggercommand_p.h> +#include <private/qscriptdebuggerevent_p.h> +#include <private/qscriptdebuggerresponse_p.h> +#include <private/qscriptdebuggerbackend_p.h> +#include <private/qscriptdebuggerobjectsnapshotdelta_p.h> + +Q_DECLARE_METATYPE(QScriptDebuggerCommand) +Q_DECLARE_METATYPE(QScriptDebuggerResponse) +Q_DECLARE_METATYPE(QScriptDebuggerEvent) +Q_DECLARE_METATYPE(QScriptContextInfo) +Q_DECLARE_METATYPE(QScriptContextInfoList) +Q_DECLARE_METATYPE(QScriptDebuggerValue) +Q_DECLARE_METATYPE(QScriptDebuggerValueList) +Q_DECLARE_METATYPE(QScriptValue::PropertyFlags) +Q_DECLARE_METATYPE(QScriptBreakpointData) +Q_DECLARE_METATYPE(QScriptBreakpointMap) +Q_DECLARE_METATYPE(QScriptScriptData) +Q_DECLARE_METATYPE(QScriptScriptMap) +Q_DECLARE_METATYPE(QScriptScriptsDelta) +Q_DECLARE_METATYPE(QScriptDebuggerValueProperty) +Q_DECLARE_METATYPE(QScriptDebuggerValuePropertyList) +Q_DECLARE_METATYPE(QScriptDebuggerObjectSnapshotDelta) +Q_DECLARE_METATYPE(QList<int>) +Q_DECLARE_METATYPE(QList<qint64>) + +void qScriptDebugRegisterMetaTypes() +{ + qMetaTypeId<QScriptDebuggerCommand>(); + qMetaTypeId<QScriptDebuggerResponse>(); + qMetaTypeId<QScriptDebuggerEvent>(); + qMetaTypeId<QScriptContextInfo>(); + qMetaTypeId<QScriptContextInfoList>(); + qMetaTypeId<QScriptDebuggerValue>(); + qMetaTypeId<QScriptDebuggerValueList>(); + qMetaTypeId<QScriptValue::PropertyFlags>(); + qMetaTypeId<QScriptBreakpointData>(); + qMetaTypeId<QScriptBreakpointMap>(); + qMetaTypeId<QScriptScriptData>(); + qMetaTypeId<QScriptScriptMap>(); + qMetaTypeId<QScriptScriptsDelta>(); + qMetaTypeId<QScriptDebuggerValueProperty>(); + qMetaTypeId<QScriptDebuggerValuePropertyList>(); + qMetaTypeId<QScriptDebuggerObjectSnapshotDelta>(); + qMetaTypeId<QList<int> >(); + qMetaTypeId<QList<qint64> >(); + + qRegisterMetaTypeStreamOperators<QScriptDebuggerCommand>("QScriptDebuggerCommand"); + qRegisterMetaTypeStreamOperators<QScriptDebuggerResponse>("QScriptDebuggerResponse"); + qRegisterMetaTypeStreamOperators<QScriptDebuggerEvent>("QScriptDebuggerEvent"); + qRegisterMetaTypeStreamOperators<QScriptContextInfo>("QScriptContextInfo"); + qRegisterMetaTypeStreamOperators<QScriptContextInfoList>("QScriptContextInfoList"); + qRegisterMetaTypeStreamOperators<QScriptBreakpointData>("QScriptBreakpointData"); + qRegisterMetaTypeStreamOperators<QScriptBreakpointMap>("QScriptBreakpointMap"); + qRegisterMetaTypeStreamOperators<QScriptScriptData>("QScriptScriptData"); + qRegisterMetaTypeStreamOperators<QScriptScriptMap>("QScriptScriptMap"); + qRegisterMetaTypeStreamOperators<QScriptScriptsDelta>("QScriptScriptsDelta"); + qRegisterMetaTypeStreamOperators<QScriptDebuggerValue>("QScriptDebuggerValue"); + qRegisterMetaTypeStreamOperators<QScriptDebuggerValueList>("QScriptDebuggerValueList"); + qRegisterMetaTypeStreamOperators<QScriptDebuggerValueProperty>("QScriptDebuggerValueProperty"); + qRegisterMetaTypeStreamOperators<QScriptDebuggerValuePropertyList>("QScriptDebuggerValuePropertyList"); + qRegisterMetaTypeStreamOperators<QScriptDebuggerObjectSnapshotDelta>("QScriptDebuggerObjectSnapshotDelta"); + qRegisterMetaTypeStreamOperators<QList<int> >("QList<int>"); + qRegisterMetaTypeStreamOperators<QList<qint64> >("QList<qint64>"); +} diff --git a/qscriptremotetargetdebugger.cpp b/qscriptremotetargetdebugger.cpp index eef37ca..58ccc3a 100644 --- a/qscriptremotetargetdebugger.cpp +++ b/qscriptremotetargetdebugger.cpp @@ -1,7 +1,6 @@ -#include <QtNetwork> -#include <QtGui> - #include "qscriptremotetargetdebugger.h" +#include <QtNetwork/qtcpsocket.h> +#include <QtGui> #include <private/qscriptdebuggerfrontend_p.h> #include <private/qscriptdebugger_p.h> @@ -19,6 +18,8 @@ #include <private/qscriptdebuggerscriptswidget_p.h> #include <private/qscriptdebuggerlocalswidget_p.h> +// #define DEBUG_DEBUGGER + namespace { class WidgetClosedNotifier : public QObject @@ -139,7 +140,9 @@ void QScriptRemoteTargetDebuggerFrontend::onSocketStateChanged(QAbstractSocket:: case QAbstractSocket::ConnectedState: { m_state = HandshakingState; QByteArray handshakeData("QtScriptDebug-Handshake"); +#ifdef DEBUG_DEBUGGER qDebug("writing handshake data"); +#endif m_socket->write(handshakeData); } break; case QAbstractSocket::BoundState: @@ -154,7 +157,7 @@ void QScriptRemoteTargetDebuggerFrontend::onSocketStateChanged(QAbstractSocket:: void QScriptRemoteTargetDebuggerFrontend::onSocketError(QAbstractSocket::SocketError error) { - Q_ASSERT(0); + Q_ASSERT_X(false, Q_FUNC_INFO, qPrintable(m_socket->errorString())); } void QScriptRemoteTargetDebuggerFrontend::onReadyRead() @@ -171,7 +174,9 @@ void QScriptRemoteTargetDebuggerFrontend::onReadyRead() if (m_socket->bytesAvailable() >= handshakeData.size()) { QByteArray ba = m_socket->read(handshakeData.size()); if (ba == handshakeData) { +#ifdef DEBUG_DEBUGGER qDebug("handshake ok!"); +#endif m_state = AttachedState; QMetaObject::invokeMethod(this, "emitAttachedSignal", Qt::QueuedConnection); if (m_socket->bytesAvailable() > 0) @@ -187,19 +192,23 @@ void QScriptRemoteTargetDebuggerFrontend::onReadyRead() } break; case AttachedState: { +#ifdef DEBUG_DEBUGGER qDebug() << "got something! bytes available:" << m_socket->bytesAvailable(); +#endif QDataStream in(m_socket); in.setVersion(QDataStream::Qt_4_5); if (m_blockSize == 0) { if (m_socket->bytesAvailable() < (int)sizeof(quint32)) return; in >> m_blockSize; - if (m_blockSize == 512) - qDebug() << m_socket->readAll().toHex(); +#ifdef DEBUG_DEBUGGER qDebug() << "blockSize:" << m_blockSize; +#endif } if (m_socket->bytesAvailable() < m_blockSize) { - qDebug("waiting for more..."); +#ifdef DEBUG_DEBUGGER + qDebug("waiting for %lld more bytes...", m_blockSize - m_socket->bytesAvailable()); +#endif return; } @@ -208,24 +217,34 @@ void QScriptRemoteTargetDebuggerFrontend::onReadyRead() in >> type; if (type == 0) { // event - qDebug() << "deserializing event"; +#ifdef DEBUG_DEBUGGER + qDebug("deserializing event"); +#endif QScriptDebuggerEvent event(QScriptDebuggerEvent::None); in >> event; - qDebug() << "notifying event of type" << event.type(); +#ifdef DEBUG_DEBUGGER + qDebug("notifying event of type %d", event.type()); +#endif notifyEvent(event); } else { // command response - qDebug() << "deserializing command response"; +#ifdef DEBUG_DEBUGGER + qDebug("deserializing command response"); +#endif qint32 id; in >> id; QScriptDebuggerResponse response; in >> response; - qDebug() << "notifying command" << id << "finished"; +#ifdef DEBUG_DEBUGGER + qDebug("notifying command %d finished", id); +#endif notifyCommandFinished((int)id, response); } Q_ASSERT(m_socket->bytesAvailable() == wasAvailable - m_blockSize); m_blockSize = 0; - qDebug() << "bytes available is now" << m_socket->bytesAvailable(); +#ifdef DEBUG_DEBUGGER + qDebug("bytes available is now %lld", m_socket->bytesAvailable()); +#endif if (m_socket->bytesAvailable() != 0) QMetaObject::invokeMethod(this, "onReadyRead", Qt::QueuedConnection); } break; @@ -243,7 +262,9 @@ void QScriptRemoteTargetDebuggerFrontend::processCommand(int id, const QScriptDe out << command; out.device()->seek(0); out << (quint32)(block.size() - sizeof(quint32)); +#ifdef DEBUG_DEBUGGER qDebug("writing command (id=%d, %d bytes)", id, block.size()); +#endif m_socket->write(block); } diff --git a/qscriptremotetargetdebugger.h b/qscriptremotetargetdebugger.h index f60a709..7c2e473 100644 --- a/qscriptremotetargetdebugger.h +++ b/qscriptremotetargetdebugger.h @@ -1,14 +1,3 @@ -/**************************************************************************** -** -** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). -** Contact: Qt Software Information (qt-info@nokia.com) -** -** This file is part of the $MODULE$ of the Qt Toolkit. -** -** $TROLLTECH_DUAL_LICENSE$ -** -****************************************************************************/ - #ifndef QSCRIPTREMOTETARGETDEBUGGER_H #define QSCRIPTREMOTETARGETDEBUGGER_H diff --git a/remotescriptdebugger.pro b/remotescriptdebugger.pro index a9124c9..6f4bfb0 100644 --- a/remotescriptdebugger.pro +++ b/remotescriptdebugger.pro @@ -5,5 +5,5 @@ INCLUDEPATH += . QT += script scripttools network # Input SOURCES += main.cpp -SOURCES += qscriptremotetargetdebugger.cpp +SOURCES += qscriptremotetargetdebugger.cpp qscriptdebuggermetatypes.cpp HEADERS += qscriptremotetargetdebugger.h |