diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp index 22adb7b23a60c89fffc45d95cca3e165b9316fff..0f7f707f3518d643a97dbffd5e869ca0f9dbbd37 100644 --- a/src/plugins/debugger/gdb/gdbengine.cpp +++ b/src/plugins/debugger/gdb/gdbengine.cpp @@ -2954,11 +2954,35 @@ void GdbEngine::handleRegisterListValues(const GdbResponse &response) Registers registers = manager()->registerHandler()->registers(); // 24^done,register-values=[{number="0",value="0xf423f"},...] - foreach (const GdbMi &item, response.data.findChild("register-values").children()) { - int index = item.findChild("number").data().toInt(); + const GdbMi values = response.data.findChild("register-values"); + foreach (const GdbMi &item, values.children()) { + const int index = item.findChild("number").data().toInt(); if (index < registers.size()) { Register ® = registers[index]; - QString value = _(item.findChild("value").data()); + GdbMi val = item.findChild("value"); + QByteArray ba; + bool handled = false; + if (val.data().startsWith("{")) { + int pos1 = val.data().indexOf("v2_int32"); + if (pos1 == -1) + pos1 = val.data().indexOf("v4_int32"); + if (pos1 != -1) { + // FIXME: This block wastes cycles. + pos1 = val.data().indexOf("{", pos1 + 1) + 1; + int pos2 = val.data().indexOf("}", pos1); + QByteArray ba2 = val.data().mid(pos1, pos2 - pos1); + foreach (QByteArray ba3, ba2.split(',')) { + ba3 = ba3.trimmed(); + QTC_ASSERT(ba3.size() >= 3, continue); + QTC_ASSERT(ba3.size() <= 10, continue); + ba.prepend(QByteArray(10 - ba3.size(), '0')); + ba.prepend(ba3.mid(2)); + } + ba.prepend("0x"); + handled = true; + } + } + const QString value = _(handled ? ba : val.data()); reg.changed = (value != reg.value); if (reg.changed) reg.value = value;