Debugger: Clearly mark unavailable register contents

The previous display as 0, or 0x0...0e (LLDB on Linux) was
less useful.

Change-Id: I820ea5ef427b65633471c7c62e44851fcfd637cd
Reviewed-by: Christian Stenger <christian.stenger@theqtcompany.com>
This commit is contained in:
hjk
2015-02-26 11:10:25 +01:00
parent fe2addf515
commit 6b0d5d6036
4 changed files with 23 additions and 16 deletions

View File

@@ -1218,7 +1218,11 @@ class Dumper(DumperBase):
for group in frame.GetRegisters(): for group in frame.GetRegisters():
for reg in group: for reg in group:
result += '{name="%s"' % reg.GetName() result += '{name="%s"' % reg.GetName()
result += ',value="%s"' % reg.GetValue() value = reg.GetValue()
if value is None:
result += ',value=""'
else:
result += ',value="%s"' % value
result += ',size="%s"' % reg.GetByteSize() result += ',size="%s"' % reg.GetByteSize()
result += ',type="%s"},' % reg.GetType() result += ',type="%s"},' % reg.GetType()
result += ']' result += ']'

View File

@@ -31,10 +31,6 @@
#include "registerhandler.h" #include "registerhandler.h"
#include "watchdelegatewidgets.h" #include "watchdelegatewidgets.h"
#if USE_REGISTER_MODEL_TEST
#include <modeltest.h>
#endif
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
namespace Debugger { namespace Debugger {
@@ -282,6 +278,7 @@ static uint decodeHexChar(unsigned char c)
void RegisterValue::operator=(const QByteArray &ba) void RegisterValue::operator=(const QByteArray &ba)
{ {
known = !ba.isEmpty();
uint shift = 0; uint shift = 0;
int j = 0; int j = 0;
v.u64[1] = v.u64[0] = 0; v.u64[1] = v.u64[0] = 0;
@@ -318,6 +315,8 @@ static QByteArray format(quint64 v, int base, int size)
QByteArray RegisterValue::toByteArray(int base, RegisterKind kind, int size) const QByteArray RegisterValue::toByteArray(int base, RegisterKind kind, int size) const
{ {
if (!known)
return "[inaccessible]";
if (kind == FloatRegister) { if (kind == FloatRegister) {
if (size == 4) if (size == 4)
return QByteArray::number(v.f[0]); return QByteArray::number(v.f[0]);
@@ -452,13 +451,13 @@ QVariant RegisterItem::data(int column, int role) const
case Qt::DisplayRole: case Qt::DisplayRole:
switch (column) { switch (column) {
case 0: { case RegisterNameColumn: {
QByteArray res = m_reg.name; QByteArray res = m_reg.name;
if (!m_reg.description.isEmpty()) if (!m_reg.description.isEmpty())
res += " (" + m_reg.description + ')'; res += " (" + m_reg.description + ')';
return res; return res;
} }
case 1: { case RegisterValueColumn: {
return m_reg.value.toByteArray(m_base, m_reg.kind, m_reg.size); return m_reg.value.toByteArray(m_base, m_reg.kind, m_reg.size);
} }
} }
@@ -472,7 +471,7 @@ QVariant RegisterItem::data(int column, int role) const
return m_reg.value.toByteArray(m_base, m_reg.kind, m_reg.size); return m_reg.value.toByteArray(m_base, m_reg.kind, m_reg.size);
case Qt::TextAlignmentRole: case Qt::TextAlignmentRole:
return column == 1 ? QVariant(Qt::AlignRight) : QVariant(); return column == RegisterValueColumn ? QVariant(Qt::AlignRight) : QVariant();
default: default:
break; break;
@@ -494,9 +493,9 @@ QVariant RegisterSubItem::data(int column, int role) const
case Qt::DisplayRole: case Qt::DisplayRole:
switch (column) { switch (column) {
case 0: case RegisterNameColumn:
return subTypeName(m_subKind, m_subSize); return subTypeName(m_subKind, m_subSize);
case 1: { case RegisterValueColumn: {
QTC_ASSERT(parent(), return QVariant()); QTC_ASSERT(parent(), return QVariant());
RegisterItem *registerItem = static_cast<RegisterItem *>(parent()); RegisterItem *registerItem = static_cast<RegisterItem *>(parent());
RegisterValue value = registerItem->m_reg.value; RegisterValue value = registerItem->m_reg.value;
@@ -526,10 +525,6 @@ RegisterHandler::RegisterHandler()
{ {
setObjectName(QLatin1String("RegisterModel")); setObjectName(QLatin1String("RegisterModel"));
setHeader(QStringList() << tr("Name") << tr("Value")); setHeader(QStringList() << tr("Name") << tr("Value"));
#if USE_REGISTER_MODEL_TEST
new ModelTest(this, 0);
#endif
} }
void RegisterHandler::updateRegister(const Register &r) void RegisterHandler::updateRegister(const Register &r)

View File

@@ -40,6 +40,13 @@
namespace Debugger { namespace Debugger {
namespace Internal { namespace Internal {
enum RegisterColumns
{
RegisterNameColumn,
RegisterValueColumn,
RegisterColumnCount
};
enum RegisterDataRole enum RegisterDataRole
{ {
RegisterNameRole = Qt::UserRole, RegisterNameRole = Qt::UserRole,
@@ -62,7 +69,7 @@ enum RegisterKind
class RegisterValue class RegisterValue
{ {
public: public:
RegisterValue() { v.u64[1] = v.u64[0] = 0; } RegisterValue() { known = false; v.u64[1] = v.u64[0] = 0; }
void operator=(const QByteArray &ba); void operator=(const QByteArray &ba);
bool operator==(const RegisterValue &other); bool operator==(const RegisterValue &other);
bool operator!=(const RegisterValue &other) { return !operator==(other); } bool operator!=(const RegisterValue &other) { return !operator==(other); }
@@ -77,6 +84,7 @@ public:
float f[4]; float f[4];
double d[2]; double d[2];
} v; } v;
bool known;
}; };
class Register class Register

View File

@@ -108,7 +108,7 @@ public:
void paint(QPainter *painter, const QStyleOptionViewItem &option, void paint(QPainter *painter, const QStyleOptionViewItem &option,
const QModelIndex &index) const const QModelIndex &index) const
{ {
if (index.column() == 1) { if (index.column() == RegisterValueColumn) {
const bool paintRed = index.data(RegisterChangedRole).toBool(); const bool paintRed = index.data(RegisterChangedRole).toBool();
QPen oldPen = painter->pen(); QPen oldPen = painter->pen();
const QColor lightColor(140, 140, 140); const QColor lightColor(140, 140, 140);