summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn Rutledge <shawn.rutledge@qt.io>2023-05-04 23:15:32 +0200
committerShawn Rutledge <shawn.rutledge@qt.io>2023-05-24 20:45:32 +0000
commit90fcd2a8ceeba10fe2cf7ef0c74f92d8b38832f6 (patch)
treef93d872b16969831ce9747617d861e31a602c3df
parentca894072bdda4cec9d7bd0b630edf710676c3659 (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.cpp41
-rw-r--r--src/trace/qmlmessagetrace_p.h5
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;