DebugMessageService: Also pass Debug Context Info

Use QMessageHandler which provides context information such
as line, file and function for the debug output.

Change-Id: I475faf4a1363d8419dec910b8a23cc44666c1908
Reviewed-by: Kai Koehne <kai.koehne@nokia.com>
This commit is contained in:
Aurindam Jana 2012-02-21 14:56:24 +01:00 committed by Qt by Nokia
parent 784d867d2b
commit a73ad904c9
3 changed files with 49 additions and 15 deletions

View File

@ -46,9 +46,10 @@ QT_BEGIN_NAMESPACE
Q_GLOBAL_STATIC(QDebugMessageService, declarativeDebugMessageService) Q_GLOBAL_STATIC(QDebugMessageService, declarativeDebugMessageService)
void DebugMessageHandler(QtMsgType type, const char *buf) void DebugMessageHandler(QtMsgType type, const QMessageLogContext &ctxt,
const char *buf)
{ {
QDebugMessageService::instance()->sendDebugMessage(type, buf); QDebugMessageService::instance()->sendDebugMessage(type, ctxt, buf);
} }
class QDebugMessageServicePrivate : public QDeclarativeDebugServicePrivate class QDebugMessageServicePrivate : public QDeclarativeDebugServicePrivate
@ -60,7 +61,7 @@ public:
{ {
} }
QtMsgHandler oldMsgHandler; QMessageHandler oldMsgHandler;
QDeclarativeDebugService::State prevState; QDeclarativeDebugService::State prevState;
}; };
@ -72,7 +73,7 @@ QDebugMessageService::QDebugMessageService(QObject *parent) :
registerService(); registerService();
if (state() == Enabled) { if (state() == Enabled) {
d->oldMsgHandler = qInstallMsgHandler(DebugMessageHandler); d->oldMsgHandler = qInstallMessageHandler(DebugMessageHandler);
d->prevState = Enabled; d->prevState = Enabled;
} }
} }
@ -82,7 +83,9 @@ QDebugMessageService *QDebugMessageService::instance()
return declarativeDebugMessageService(); return declarativeDebugMessageService();
} }
void QDebugMessageService::sendDebugMessage(QtMsgType type, const char *buf) void QDebugMessageService::sendDebugMessage(QtMsgType type,
const QMessageLogContext &ctxt,
const char *buf)
{ {
Q_D(QDebugMessageService); Q_D(QDebugMessageService);
@ -92,10 +95,12 @@ void QDebugMessageService::sendDebugMessage(QtMsgType type, const char *buf)
QByteArray message; QByteArray message;
QDataStream ws(&message, QIODevice::WriteOnly); QDataStream ws(&message, QIODevice::WriteOnly);
ws << QByteArray("MESSAGE") << type << QString::fromLocal8Bit(buf).toUtf8(); ws << QByteArray("MESSAGE") << type << QString::fromLocal8Bit(buf).toUtf8();
ws << ctxt.version << QString::fromLatin1(ctxt.file).toUtf8();
ws << ctxt.line << QString::fromLatin1(ctxt.function).toUtf8();
sendMessage(message); sendMessage(message);
if (d->oldMsgHandler) if (d->oldMsgHandler)
(*d->oldMsgHandler)(type, buf); (*d->oldMsgHandler)(type, ctxt, buf);
} }
void QDebugMessageService::stateChanged(State state) void QDebugMessageService::stateChanged(State state)
@ -103,13 +108,13 @@ void QDebugMessageService::stateChanged(State state)
Q_D(QDebugMessageService); Q_D(QDebugMessageService);
if (state != Enabled && d->prevState == Enabled) { if (state != Enabled && d->prevState == Enabled) {
QtMsgHandler handler = qInstallMsgHandler(d->oldMsgHandler); QMessageHandler handler = qInstallMessageHandler(d->oldMsgHandler);
// has our handler been overwritten in between? // has our handler been overwritten in between?
if (handler != DebugMessageHandler) if (handler != DebugMessageHandler)
qInstallMsgHandler(handler); qInstallMessageHandler(handler);
} else if (state == Enabled && d->prevState != Enabled) { } else if (state == Enabled && d->prevState != Enabled) {
d->oldMsgHandler = qInstallMsgHandler(DebugMessageHandler); d->oldMsgHandler = qInstallMessageHandler(DebugMessageHandler);
} }

View File

@ -55,6 +55,8 @@
#include "qdeclarativedebugservice_p.h" #include "qdeclarativedebugservice_p.h"
#include <QtCore/qlogging.h>
QT_BEGIN_HEADER QT_BEGIN_HEADER
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@ -71,7 +73,8 @@ public:
static QDebugMessageService *instance(); static QDebugMessageService *instance();
void sendDebugMessage(QtMsgType type, const char *buf); void sendDebugMessage(QtMsgType type, const QMessageLogContext &ctxt,
const char *buf);
protected: protected:
void stateChanged(State); void stateChanged(State);

View File

@ -81,13 +81,19 @@ struct LogEntry {
QtMsgType type; QtMsgType type;
QString message; QString message;
int version;
int line;
QString file;
QString function;
QString toString() const { return QString::number(type) + ": " + message; } QString toString() const { return QString::number(type) + ": " + message; }
}; };
bool operator==(const LogEntry &t1, const LogEntry &t2) bool operator==(const LogEntry &t1, const LogEntry &t2)
{ {
return t1.type == t2.type && t1.message == t2.message; return t1.type == t2.type && t1.message == t2.message
&& t1.line == t2.line && t1.file == t2.file
&& t1.function == t2.function;
} }
class QDeclarativeDebugMsgClient : public QDeclarativeDebugClient class QDeclarativeDebugMsgClient : public QDeclarativeDebugClient
@ -127,13 +133,22 @@ void QDeclarativeDebugMsgClient::messageReceived(const QByteArray &data)
if (command == "MESSAGE") { if (command == "MESSAGE") {
int type; int type;
QByteArray message; QByteArray message;
ds >> type >> message; QByteArray file;
QByteArray function;
int line;
int version;
ds >> type >> message >> version >> file >> line >> function;
QVERIFY(ds.atEnd()); QVERIFY(ds.atEnd());
QVERIFY(type >= QtDebugMsg); QVERIFY(type >= QtDebugMsg);
QVERIFY(type <= QtFatalMsg); QVERIFY(type <= QtFatalMsg);
logBuffer << LogEntry((QtMsgType)type, QString::fromUtf8(message)); LogEntry entry((QtMsgType)type, QString::fromUtf8(message));
entry.line = line;
entry.version = version;
entry.file = QString::fromLatin1(file);
entry.function = QString::fromLatin1(function);
logBuffer << entry;
emit debugOutput(); emit debugOutput();
} else { } else {
QFAIL("Unknown message"); QFAIL("Unknown message");
@ -210,8 +225,19 @@ void tst_QDebugMessageService::retrieveDebugOutput()
QVERIFY(m_client->logBuffer.size() >= 2); QVERIFY(m_client->logBuffer.size() >= 2);
QVERIFY(m_client->logBuffer.contains(LogEntry(QtDebugMsg, QLatin1String("console.log")))); const QString path =
QVERIFY(m_client->logBuffer.contains(LogEntry(QtDebugMsg, QLatin1String("console.count: 1")))); QUrl::fromLocalFile(QDeclarativeDataTest::instance()->testFile(QMLFILE)).toString();
LogEntry entry1(QtDebugMsg, QLatin1String("console.log"));
entry1.line = 48;
entry1.file = path;
entry1.function = QLatin1String("onCompleted");
LogEntry entry2(QtDebugMsg, QLatin1String("console.count: 1"));
entry2.line = 49;
entry2.file = path;
entry2.function = QLatin1String("onCompleted");
QVERIFY(m_client->logBuffer.contains(entry1));
QVERIFY(m_client->logBuffer.contains(entry2));
} }
QTEST_MAIN(tst_QDebugMessageService) QTEST_MAIN(tst_QDebugMessageService)