summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKent Hansen <khansen@trolltech.com>2009-06-12 12:58:17 +0200
committerKent Hansen <khansen@trolltech.com>2009-06-12 12:58:17 +0200
commitda101c777366793b11e8bb4714a26c754656ca0b (patch)
treeeb1ce5574211aa20e939950f8d96780aac9ed686
parent7db7c6bd5e47b6d329aba162cb1afd2d9e7b8757 (diff)
make the remote debugger work (mostly)
-rw-r--r--debuggee/debuggee.pro2
-rw-r--r--debuggee/main.cpp14
-rw-r--r--debuggee/qscriptdebuggerconnector.cpp103
-rw-r--r--debuggee/qscriptdebuggerconnector.h18
-rw-r--r--main.cpp37
-rw-r--r--qscriptdebuggermetatypes.cpp65
-rw-r--r--qscriptremotetargetdebugger.cpp45
-rw-r--r--qscriptremotetargetdebugger.h11
-rw-r--r--remotescriptdebugger.pro2
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
{
diff --git a/main.cpp b/main.cpp
index 1d55979..3d21995 100644
--- a/main.cpp
+++ b/main.cpp
@@ -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