diff options
author | Shawn Rutledge <shawn.rutledge@qt.io> | 2023-05-04 23:15:32 +0200 |
---|---|---|
committer | Shawn Rutledge <shawn.rutledge@qt.io> | 2023-05-24 20:45:32 +0000 |
commit | 90fcd2a8ceeba10fe2cf7ef0c74f92d8b38832f6 (patch) | |
tree | f93d872b16969831ce9747617d861e31a602c3df | |
parent | ca894072bdda4cec9d7bd0b630edf710676c3659 (diff) |
Add and use static objectId() method
We always want to see objectName if possible, or object hash if not,
rather than a hex pointer as the participant name.
Change-Id: I133475807b3747ca106d231c5d8fb1352cbc0c95
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
-rw-r--r-- | src/trace/qmlmessagetrace.cpp | 41 | ||||
-rw-r--r-- | src/trace/qmlmessagetrace_p.h | 5 |
2 files changed, 33 insertions, 13 deletions
diff --git a/src/trace/qmlmessagetrace.cpp b/src/trace/qmlmessagetrace.cpp index 284b2ba..db1c0b2 100644 --- a/src/trace/qmlmessagetrace.cpp +++ b/src/trace/qmlmessagetrace.cpp @@ -154,6 +154,7 @@ using namespace Qt::StringLiterals; QHash<QByteArray, QList<QmlMessageTrace*> > QmlMessageTrace::m_categoryInstances; QtMessageHandler QmlMessageTrace::m_parentMessageHandler(nullptr); +QHash<void*, QObject*> QmlMessageTrace::m_objects; // Regex for stuff like QQuickMouseArea(0x16b9cf0, name="outerMA", parent=0x16fc070, geometry=0,0 100x400) // Captures only the part outside parentheses and the part inside @@ -182,6 +183,24 @@ static QString pointerHash(void* ptr) return QLatin1String(ret); } +QString QmlMessageTrace::objectId(void *obj) +{ + QString ret; + QObject *qo = m_objects.value(obj); + if (qo) { + QObjectPrivate *opriv = QObjectPrivate::get(qo); + if (!opriv->wasDeleted && !opriv->isDeletingChildren) + ret = qo->objectName(); + } + if (ret.isEmpty()) { + ret = pointerHash(obj); + if (!qo) + qWarning() << "unknown participant?" << obj << "is" << ret; + // might be a QObjectPrivate, but it's not safe to check + } + return ret; +} + void QmlMessageTrace::messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &text) { bool consumed = false; @@ -362,12 +381,7 @@ void QmlMessageTrace::writeObjectInstancePuml(QFile &f, QObject *o) int qmlSuffixIdx = className.indexOf(QStringLiteral("_QML")); if (qmlSuffixIdx > 0) className = className.left(qmlSuffixIdx); - QObjectPrivate *opriv = QObjectPrivate::get(o); - QString oName; - if (!opriv->wasDeleted && !opriv->isDeletingChildren) - oName = o->objectName(); - if (oName.isEmpty()) - oName = QStringLiteral("0x%1").arg(qulonglong(o), 0, 16); + QString oName = objectId(o); if (className.isEmpty()) { qWarning() << "unknown class for" << o; return; @@ -657,17 +671,22 @@ QString QmlMessageTrace::Message::toQml() const */ QString QmlMessageTrace::Message::toPuml() const { - QString callerId = callerPointer ? pointerHash(callerPointer) : QStringLiteral("ufo_") + callerClass; + QString callerId = callerPointer ? objectId(callerPointer) : QStringLiteral("ufo_") + callerClass; + QString calleeId = calleePointer ? objectId(calleePointer) : QStringLiteral("ufo_") + calleeClass; -MT_DEBUG(" callee %s %p\n", qPrintable(calleeSignature), calleePointer); +// MT_DEBUG(" toPuml: caller %p %s %s callee %p %s %s\n", +// callerPointer, qPrintable(callerId), qPrintable(callerMethod), +// calleePointer, qPrintable(calleeId), qPrintable(calleeSignature)); - QString ret = u"%1 -> %2: %3(%4)\n"_s - .arg(callerId).arg(pointerHash(calleePointer)).arg(calleeMethod).arg(params); +// QString ret = u"%1 -> %2: %3(%4)\n"_s +// .arg(callerId).arg(calleeId).arg(calleeMethod).arg(params); + QString ret = u"%1 -> %2: %3\n"_s + .arg(callerId).arg(calleeId).arg(calleeMethod); if (!calleeSignature.isEmpty()) { auto sigWords = calleeSignature.split(u' '); if (sigWords.first() != u"void") ret += u"%1 <-- %2: %3\n"_s - .arg(callerId).arg(pointerHash(calleePointer)).arg(sigWords.first()); + .arg(callerId).arg(calleeId).arg(sigWords.first()); } return ret; } diff --git a/src/trace/qmlmessagetrace_p.h b/src/trace/qmlmessagetrace_p.h index 2ea1eeb..3ca6a1d 100644 --- a/src/trace/qmlmessagetrace_p.h +++ b/src/trace/qmlmessagetrace_p.h @@ -88,6 +88,7 @@ private: void log(QtMsgType type, const QMessageLogContext &context, const QString &rawText); void logBacktrace(QStringList trace); void parseClassAndMethod(const QString &classAndMethod, QString &className, QString &methodName); + static QString objectId(void *obj); void addObjectInstance(void *obj, const QString &objClass); void writeObjectInstanceQml(QFile &f, QObject *o); void writeObjectInstancePuml(QFile &f, QObject *o); @@ -104,6 +105,7 @@ private: QString callerClass; QString callerMethod; void *calleePointer; + QString calleeClass; QString calleeMethod; QString calleeSignature; QStringList backtrace; @@ -118,7 +120,7 @@ private: static QRegularExpression m_regexObjectFormatted; static QRegularExpression m_regexPointer; - static int m_refCount; + static QHash<void*, QObject*> m_objects; // both QObjects and QObjectPrivates have entries here QList<Message> m_messages; QStringList m_previousBacktrace; @@ -126,7 +128,6 @@ private: QHash<QString, QString> m_tracedObjectsById; QHash<QString, void*> m_recentObjectsByClass; - QHash<void*, QObject*> m_objects; // both QObjects and QObjectPrivates have entries here bool m_enabled; QByteArray m_category; |