debugger: add option to automatically derefence pointers in locals&watchers

This commit is contained in:
hjk
2009-10-06 10:54:08 +02:00
parent 2eed41b6df
commit d130588469
7 changed files with 47 additions and 16 deletions

View File

@@ -203,6 +203,9 @@ GdbEngine::GdbEngine(DebuggerManager *manager) :
connect(this, SIGNAL(applicationOutputAvailable(QString)),
m_manager, SLOT(showApplicationOutput(QString)),
Qt::QueuedConnection);
connect(theDebuggerAction(AutoDerefPointers), SIGNAL(valueChanged(QVariant)),
this, SLOT(setAutoDerefPointers(QVariant)));
}
void GdbEngine::connectDebuggingHelperActions()
@@ -2703,6 +2706,13 @@ void GdbEngine::setUseDebuggingHelpers(const QVariant &on)
updateLocals();
}
void GdbEngine::setAutoDerefPointers(const QVariant &on)
{
Q_UNUSED(on)
setTokenBarrier();
updateLocals();
}
bool GdbEngine::hasDebuggingHelperForType(const QString &type) const
{
if (!theDebuggerBoolSetting(UseDebuggingHelpers))
@@ -2864,22 +2874,23 @@ void GdbEngine::updateSubItem(const WatchData &data0)
#if DEBUG_SUBITEM
qDebug() << "IT'S A POINTER";
#endif
#if 1
data.setChildrenUnneeded();
insertData(data);
WatchData data1;
data1.iname = data.iname + QLatin1String(".*");
data1.name = QLatin1Char('*') + data.name;
data1.exp = QLatin1String("(*(") + data.exp + QLatin1String("))");
data1.type = stripPointerType(data.type);
data1.setValueNeeded();
insertData(data1);
#else
// Try automatic dereferentiation
data.exp = _("*(") + data.exp + _(")");
data.type = data.type + _("."); // FIXME: fragile HACK to avoid recursion
insertData(data);
#endif
if (theDebuggerBoolSetting(AutoDerefPointers)) {
// Try automatic dereferentiation
data.exp = _("(*(") + data.exp + _("))");
data.type = data.type + _("."); // FIXME: fragile HACK to avoid recursion
insertData(data);
} else {
data.setChildrenUnneeded();
insertData(data);
WatchData data1;
data1.iname = data.iname + QLatin1String(".*");
data1.name = QLatin1Char('*') + data.name;
data1.exp = QLatin1String("(*(") + data.exp + QLatin1String("))");
data1.type = stripPointerType(data.type);
data1.setValueNeeded();
insertData(data1);
}
return;
}