diff --git a/share/qtcreator/gdbmacros/gdbmacros.cpp b/share/qtcreator/gdbmacros/gdbmacros.cpp index 029de5f6a6c1c38703cb883a5b3d99c27005730f..5cd7ed519ce9210042b5fc4cffdf997d76fff0ec 100644 --- a/share/qtcreator/gdbmacros/gdbmacros.cpp +++ b/share/qtcreator/gdbmacros/gdbmacros.cpp @@ -2187,6 +2187,44 @@ static void qDumpQVector(QDumper &d) d.disarm(); } +static void qDumpQWeakPointer(QDumper &d) +{ + const int v = sizeof(void *); + const void *value = deref(addOffset(d.data, v)); + + if (isSimpleType(d.innertype)) + qDumpInnerValueHelper(d, d.innertype, value); + else + P(d, "value", ""); + P(d, "valuedisabled", "true"); + P(d, "numchild", 1); + if (d.dumpChildren) { + d << ",children=["; + d.beginHash(); + P(d, "name", "data"); + qDumpInnerValue(d, d.innertype, value); + d.endHash(); + d.beginHash(); + const void *weak = addOffset(deref(d.data), v); + P(d, "name", "weakref"); + P(d, "value", *static_cast<const int *>(weak)); + P(d, "type", "int"); + P(d, "addr", weak); + P(d, "numchild", "0"); + d.endHash(); + d.beginHash(); + const void *strong = addOffset(weak, sizeof(int)); + P(d, "name", "strongref"); + P(d, "value", *static_cast<const int *>(strong)); + P(d, "type", "int"); + P(d, "addr", strong); + P(d, "numchild", "0"); + d.endHash(); + d << "]"; + } + d.disarm(); +} + static void qDumpStdList(QDumper &d) { const std::list<int> &list = *reinterpret_cast<const std::list<int> *>(d.data); @@ -2559,16 +2597,6 @@ static void handleProtocolVersion2and3(QDumper & d) else if (isEqual(type, "QStringList")) qDumpQStringList(d); break; - case 'T': - if (isEqual(type, "QTextCodec")) - qDumpQTextCodec(d); - break; - case 'V': - if (isEqual(type, "QVariant")) - qDumpQVariant(d); - else if (isEqual(type, "QVector")) - qDumpQVector(d); - break; case 's': if (isEqual(type, "wstring")) qDumpStdWString(d); @@ -2589,6 +2617,19 @@ static void handleProtocolVersion2and3(QDumper & d) else if (isEqual(type, "std::wstring")) qDumpStdWString(d); break; + case 'T': + if (isEqual(type, "QTextCodec")) + qDumpQTextCodec(d); + break; + case 'V': + if (isEqual(type, "QVariant")) + qDumpQVariant(d); + else if (isEqual(type, "QVector")) + qDumpQVector(d); + break; + case 'W': + if (isEqual(type, "QWeakPointer")) + qDumpQWeakPointer(d); } if (!d.success) @@ -2664,6 +2705,7 @@ void *qDumpObjectData440( "\""NS"QTextCodec\"," "\""NS"QVariant\"," "\""NS"QVector\"," + "\""NS"QWeakPointer\"," "\""NS"QWidget\"," #ifdef Q_OS_WIN "\"basic_string\"," diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index 04966d4023daa58e959e19a8ef47d8249c5bc136..d391907adca77a109bdabbce9d738669d884905d 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -3047,11 +3047,10 @@ void GdbEngine::runDebuggingHelper(const WatchData &data0, bool dumpChildren) //int protocol = isDisplayedIName(data.iname) ? 3 : 2; QString addr; - if (data.addr.startsWith(QLatin1String("0x"))) { + if (data.addr.startsWith(QLatin1String("0x"))) addr = QLatin1String("(void*)") + data.addr; - } else { + else addr = QLatin1String("&(") + data.exp + QLatin1Char(')'); - } sendWatchParameters(params); diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp index 608198bb28de4f70d4631c920790b70ff9fa909c..a5b0d0c2a6ab2a0d5343fa4e5b7f3eb41d63d439 100644 --- a/tests/manual/gdbdebugger/simple/app.cpp +++ b/tests/manual/gdbdebugger/simple/app.cpp @@ -549,9 +549,13 @@ void testQSharedPointer() QSharedPointer<QString> ptr2 = ptr; QSharedPointer<QString> ptr3 = ptr; - //QWeakPointer<QString> wptr(ptr); - //QWeakPointer<QString> wptr2 = wptr; - //QWeakPointer<QString> wptr3 = wptr; + QWeakPointer<int> wiptr(iptr); + QWeakPointer<int> wiptr2 = wiptr; + QWeakPointer<int> wiptr3 = wiptr; + + QWeakPointer<QString> wptr(ptr); + QWeakPointer<QString> wptr2 = wptr; + QWeakPointer<QString> wptr3 = wptr; } void stringRefTest(const QString &refstring)